已归档 - 将英特尔® 实感™ SDK 面部扫描应用于 3D 网格

已发布:12/07/2015   最后更新时间:02/23/2016

英特尔® 实感™ SDK 已停产。 不再继续提供支持或更新。

下载代码示例

该示例使用英特尔® 实感™ SDK 进行扫描,并在现有的 3D 角色模型上绘制用户的面部。 该代码使用 C++ 编写而成,并使用 DirectX*。 本示例要求安装英特尔® 实感™ SDK R5 或更高版本,具体可访问此处

扫描

WM5 SDK 中的面部扫描模块经过了显著的改进, 具体包括:

  • 改进颜色数据
  • 通过给出提示指导用户将面部放在最理想的初始位置,提高了扫描的一致性
  • 面部特征数据代表主要面部特征的位置

借助这些改进,能够生成更加一致的结果,并减轻用户的修改工作,从而可以更轻松地集成至游戏和其他 3D 应用。

本示例中实施的扫描将引导用户根据英特尔® 实感™ SDK 给出的提示,将头部放在最合适的位置。 满足定位要求后,示例将启用开始扫描按钮。

该示例重点关注的是面部映射流程,因此用于在扫描过程中指导用户的 GUI 并不是最佳选择。 面向最终用户应用的界面应该能够更好地指导用户站在正确的起始位置,并在扫描开始后提供指示。

扫描输出包括一个 .OBJ 型号文件,以及示例在面部映射阶段要用到的相关纹理。


图 1:面部扫描模块提供预览图像帮助用户最大限度地扩大扫描范围。


图 2:扫描后形成的网格。 最右边的图像显示了特征数据。 请注意,该扫描仅针对面部扫描,而非整个头部。 颜色数据从扫描的第 1 个帧开始捕捉,然后投影在面部网格上;这种方法可以确保较高的色彩效果,不过会导致纹理延伸至头部的两侧。

面部映射

该示例第 2 部分使用扫描面部颜色和几何图形数据,并将其混合至现有的头部模型。 难点是如何通过扫描面部创建完整的头部。 不同于将扫描面部网格拼接在头部模型上的方法,该技巧转移现有头部模型的几何图形。 着色器在头部网格和面部网格之间执行顶点位移和颜色混合。 颜色混合可以在每次渲染头部模型时进行,也可以通过缓存结果一次性完成。 本示例支持这两种方法。

该映射技巧包含以下高级流程:

  1. 使用正交投影矩阵渲染扫描面部网格,以创建位移贴图和颜色贴图。
  2. 创建矩阵,以将头部模型上的位置投影至已生成的位移贴图和颜色贴图。 该投影矩阵充分考虑了面部特征数据决定的比例和平移。
  3. 使用投影矩阵渲染头部模型,将顶点位置映射至位移贴图和颜色贴图上的纹理坐标。
  4. 对生成的图抽样检查,调整顶点并给像素着色。 颜色贴图和原始头部纹理之间的混合由美术师创建的控制图来控制。
  5. (可选)使用相同的位移和混合方法创建位移网格和包含所有混合效果的单个漫射颜色纹理。

艺术资产

本示例中使用了以下艺术资产:

头部模型。用到面部的头部模型。 面部区域的顶点经过位移后,拥有较高的分辨率,可为该模型带来优势。

特征图。映射至头部模型的 UV 中的纹理,会影响头部的亮度。

细节图。重复纹理,将其他细节应用于特征贴图。

色彩传递图。控制两种基础肤色之间的混合。 这样有助于在头部的不同位置使用不同的色调。 例如,脸颊和耳朵的颜色与其他部位会稍有不同。

控制图。控制位移贴图和色彩贴图与现有头部模型数据之间的混合。 控制图的每个通道都有不同的目的:

  • 红色通道是顶点 Z 位移的权重。 权重为 0 表示使用头部模型的顶点位置,权重为 1 表示根据生成的位移贴图调整 Z 顶点位置,而中间值可将两者合二为一。
  • 绿色通道是用于混合头部漫射颜色和生成的面部颜色贴图的权重。 0 表示整个头部漫射,而 1 表示整个面部的颜色。
  • 蓝色通道是可覆盖下颚骨的可选通道。 它可结合绿色通道使用,从而支持使用用户下颚骨的颜色,而非头部模型的漫射颜色。 它可以适用于用户面部长有毛发的情况。

所有的图都在头部模型 UV 空间中创建。


图 3:头部模型资产和高度细分的面部。 扫描面部将从高分辨率区域开始拉伸。


图 4:特征图(左)和细节图(右)。 细节图由头部模型 UV 绘制,但会重复多次以添加更多细节。


图 5:色彩传递图(左)以及在头部模型上绘制的色彩传递图(右)。 该图可确定用户选择的两种肤色的权重。


图 6:控制图(左)以及应用于头部模型的控制图。 红色通道表示应受到位移贴图影响的区域。 绿色通道表示应接收扫描颜色贴图的区域。 蓝色通道表示下颚骨区域。 使用下颚骨区域的颜色贴图,可以捕捉面部毛发等明显的下颚骨特征。

位移贴图和颜色贴图

面部映射流程的第一步是根据扫描面部网格生成位移贴图和颜色贴图。 这些贴图通过使用正交投影矩阵渲染面部网格生成。 本示例使用了多个渲染对象,以通过单个绘制调用生成景深位移贴图和颜色贴图。 它设置了投影矩阵,以便面部完全包含在视口 (viewport) 之中。


图 7:通过扫描面部网格生成的位移贴图和颜色贴图。

贴图投影矩阵

现在我们使用扫描面部模型和头部模型的特征数据来创建变换矩阵,以将模型空间中的头部模型顶点坐标转换成位移贴图和颜色贴图空间中的纹理坐标。 我们将调用这个贴图投影矩阵,因为它可以有效地将位移贴图投影到头部模型上。

该贴图投影矩阵包含平移和比例变换:

  • 比例变换。比例因子根据扫描面部网格中(投影图坐标中)与面部模型中的眼睛之间的距离比计算得出。
  • 平移变换。顶点平移采用头部模型和扫描面部网格的特征数据来计算。 平移可以使头部模型中双眼之间的点直接与位移贴图中相应的点对齐。 为了计算相应的点,我们使用左右眼特征计算中间点,然后在生成位移贴图和颜色贴图时,通过所使用的正交投影矩阵进行平移。
  • 旋转变换。本示例假设扫描面部网格是轴向对齐的,无需进行旋转。 本示例包含 GUI 控制,以引入旋转支持艺术控制。


图 8:生成的颜色贴图(左)以正交的方式投影至头部模型。 该贴图经过平移和缩放,以便双眼之间的黄色锚点对齐。

渲染

在渲染期间,本示例在顶点和像素着色器中使用生成的位移贴图和颜色贴图。

顶点着色器

顶点着色器根据位移贴图移动模型的 Z 坐标。 位移贴图纹理坐标发送至像素着色器,用于对支持混合的颜色贴图进行抽样。

顶点着色器的步骤包括:

  1. 通过贴图投影矩阵变换顶点位置,以获取颜色/位移贴图纹理坐标。
  2. 通过计算的坐标对位移贴图纹理进行抽样。
  3. 将位移样本转换成模型空间 Z 值。 位移贴图的范围和比例通过常量缓冲器传递。
  4. 根据控制图的红色组件混合移动后的 Z 值和原始 Z 值。 控制图有助于美术师决定对哪些顶点进行位移,并逐渐、顺利地过渡至移动后的位置。
  5. 将位移贴图 UV 坐标传递至像素着色器,用于对颜色贴图进行抽样。

像素着色器

像素着色器采用控制贴图的绿色通道混合头部颜色和生成的颜色贴图纹理。 由于样本支持用户改变头部颜色,以更好地匹配扫描面部颜色,所以颜色将与像素着色器中的灰度艺术资产进行混合。 根据彩色传递图混合用户选择的两种颜色后,可以针对各像素计算肤色。 肤色乘以灰度的强度,等于最终的头部颜色。


图 9:在不采用位移或颜色贴图的情况下混合头部模型。


图 10:使用示例实时合成的最终结果

导出

该技巧在像素着色器中采用多层混合的方法,而且每次渲染模型时,会在顶点着色器中调整顶点位置。 示例还支持将合成的纹理和变形后的网格导出至 .OBJ 文件。

整个合成和变形过程仍然通过原始着色器的变量在 GPU 上进行。 新顶点着色器使用 Direct3D*流输出支持功能捕捉变形后的顶点。 顶点着色器还将输入纹理坐标当作输出位置,这样可以有效地渲染 UV 映射的新纹理。

合成后,模型的渲染开销将显著降低,而且无需使用任何自定义着色器,从而轻松地通过 3D 建模工具和游戏引擎加载。


图 11:导出的 .OBJ 模型(左),合成的头部纹理 UV 映射至头部模型的 UV。

产品和性能信息

1

英特尔的编译器针对非英特尔微处理器的优化程度可能与英特尔微处理器相同(或不同)。这些优化包括 SSE2、SSE3 和 SSSE3 指令集和其他优化。对于在非英特尔制造的微处理器上进行的优化,英特尔不对相应的可用性、功能或有效性提供担保。该产品中依赖于微处理器的优化仅适用于英特尔微处理器。某些非特定于英特尔微架构的优化保留用于英特尔微处理器。关于此通知涵盖的特定指令集的更多信息,请参阅适用产品的用户指南和参考指南。

通知版本 #20110804