Unity 5 - BLACKSMITH深度分享之项目中的皱纹贴图
在上一篇文章中,我们为大家介绍了BLACKSMITH独特的角色阴影。本次,我们将深入分享BLACKSMITH项目中的皱纹贴图相关内容。此系列文章将会同步在Unity官方微信平台和Unity中文官方社区更新,敬请持续关注。
在筹备The Blacksmith短片项目时,我们起初并未打算将自定义皮肤着色器作为一项专门工作来深入推进。不过,我们希望通过一些简单的方法,让挑战者的表情更加生动。经过头脑风暴,我们决定为项目添加一个驱动皱纹纹理的形状融合(blendshape)。为了给表情增添深度和细节,我们认为让皱纹同时作用于法线和遮挡,采用标准着色器(Standard shader)能取得最佳效果。同时,我们也希望能对特定的脸部表情表达进行一定限制。
皱纹贴图驱动设计
我们创建了一个专门的组件,该组件可让动画器(Animator)定义皱纹层,网格(Mesh)中的每个形状融合都对应一层。皱纹层的定义包括纹理贴图、强度指示器以及一组与人脸各部分匹配的遮蔽权值。借助遮蔽权值,每个具体的皱纹层可以作用于1 - 4个面部区域,并对不同区域产生不同程度的影响。
由于我们希望在任意给定时间混合多达四个不同的表情,在任何情况下,仅混合操作就需要11个纹理采样(两个基础纹理、八个细节纹理和一个遮罩纹理)。因此,切实可行的选择是将皱纹贴图在一个屏幕外的预渲染通道中进行组合。我们发现ARGB2101010渲染纹理格式非常符合我们的需求,因为它允许我们仅使用10bit通道中的两个来处理法线,剩余的一个通道用于存放遮蔽信息。在每一帧,皱纹贴图组件会找出四个最具影响力的形状融合,然后根据权值进行分层渲染。
一旦在屏幕空间内完成所有皱纹数据的合成,接下来唯一要做的就是重定向用于绘制人脸的标准着色器的法线和遮蔽数据输入。在实际操作中,只需在表面着色器(surface shader)的主函数中添加几行代码即可。
最终结果
在极度愤怒表情下,对比原基础头部和皱纹贴图在满权重呈现时所带来的额外细节。
我们还额外编写了多种调试输出模式,通过这些模式,我们能够轻松查看完全融合的遮蔽和法线贴图,这有助于确定各个组件在最终结果中所起的作用。
Take it for a spin
我们已将这一功能单独抽离到一个示例项目中,你可以从Asset Store获取该项目:示例项目链接。该项目仅包含维京挑战者的头部,带有两个我们在Blacksmith短片中使用的表情。对于在你自己的游戏中应用皱纹贴图而言,这是一个很好的开端。