摄影测量流程中的分层着色器
在《ADAM》、《死者之书》中都运用到摄影测量技术,开发者可以使用照片建模技术捕捉现实世界中的对象和材质。Unity照片建模工作流程中,如何使用分层着色器实现所展示的相同质量效果,并且优化纹理内存以满足项目需求尤为重要。
本文中所使用的示例包含:
一个由岩石、地面和树根构成的主对象
多种材质:石头、地面元素(各种树枝突起物)、苔藓
通过照片建模技术可以获得非常高质量的模型,但需要极高的纹理分辨率来保留细节,如下图所示。
这么大的内存开销对于游戏来说是不现实的,而且你还无法为对象增加任何变化。需要为对象增加变化,可以使用以下任意一个着色器:
常规着色器( Regular shader)
分层着色器 (Layered shader)
用于材质分层的分层着色器
常规着色器
常规着色器决定了材质的外观视觉效果。仅使用游戏对象本身的材质进行显示,效果可能不会太好,因为所有的材质都已合并。
本示例中,材质由石头、地面元素和苔藓组成。
分层着色器
分层着色器使用各种材质的组合来决定视觉效果。上图中显示的主材质与石头、地面元素和苔藓等其它材质混合在一起,这些其它的材质都是可平铺的。这意味着,它们可以环绕对象,并且可以在不同的对象上重用它们。使用材质组合,可以帮助你获得与使用高分辨率纹理类似的视觉质量,例如:屏幕纹理像素密度相似,从而节省对内存的使用。
分层着色器允许在不同资源之间共享纹理,以及通过组合可平铺材质增添变化。这可以以较低的成本填充一个很大的世界。
用于材质分层的分层着色器
你还可以使用Scriptable Render Pipeline包中提供的HDRenderPipeline分层着色器对材质进行合并,分层着色器有专门针对照片建模资源的特定选项。
HDRenderPipeline分层着色器请访问Github下载:
https://github.com/Unity-Technologies/ScriptableRenderLoop
针对照片建模技术使用分层着色器
下面将介绍如何使用HDRenderPipeline包中提供的分层着色器。
为主材质准备纹理
要为一个对象准备纹理,请参照照片建模技术过程,为主材质制作一套纹理。
其中一些纹理仅用于去光照过程,烘焙工具会生成用于主材质的漫反射贴图、法线贴图、高度贴图和AO贴图纹理。其它纹理则需要你自己来制作,例如:金属贴图、细节遮罩贴图和光滑度贴图。你可以在任何图像编辑软件中进行制作。
如果需要在照片建模中使用分层着色器,则需要完成下面几步:
使用图像编辑软件将所有纹理打包
去除漫反射纹理上的光照
通过烘焙获取高度贴图信息
下面是所需贴图的种类:
基色(Base color):通过烘焙和去光照创建一个基色。
法线贴图(Normal map):通过烘焙切线,创建一个法线贴图。
高度贴图(Height map):通过烘焙创建一个高度贴图。烘焙工具为高度贴图采样提供了最小值、中间值和最大值。保存或写下这些值,而后在Unity编辑器中将它们写入分层着色器。
遮罩贴图(Mask map):在图像编辑软件中创建一个线性合成贴图。红色通道用作金属遮罩。绿色通道用作环境遮蔽。蓝色通道用于细节遮罩。Alpha通道用于光滑度。
下图展示了遮罩贴图中的几个通道。
为可平铺材质准备纹理
照片建模技术过程会捕捉一套材质,此后你可利用这些材质复原层细节,这些材质与主材质不同,是可平铺的。在岩石这个例子中,有一套用于石头、地面和苔藓的材质。
与主材质类似,除了那些需要进行平铺的材质之外,你需要为分层着色器按照需求列表打包所需的纹理。
为可平铺材质添加细节纹理
通过为平铺材质添加细节纹理,可以创造出高分辨率纹理的幻觉。细节纹理是一种小型可重复图案,用于提供额外的微小细节。它是分层照片建模着色器的一个可选功能。要制作细节纹理,可以遵照照片建模制作步骤。细节纹理仅支持基色、法线贴图与光滑度。分层着色器需要进行以下的打包操作。
设置材质
要在Unity编辑器中创建一个HDRenderPipeline光照着色器,首先要新建一个材质。右击项目浏览器并选择Create > Material。默认这会创建一个光照着色器。
然后,将纹理拖动到相应的栏位。
高度贴图主要用于曲面细分或逐像素移位。在本文的岩石示例中,共创建了一个主材质与三个可平铺材质,可用于石头、地面元素和苔藓。
设置分层着色器
创建分层着色器
要在编辑器中新建一个HDRenderPipeline分层着色器,可右击项目浏览器,选择Create> Material。然后,在新材质上,选择HDRenderPipeline > LayeredLit着色器或者LayeredLitTessellation着色器,以使用曲面细分。
分层着色器最多支持4层。第一层称为Main Layer,其它层分别称为Layer1、Layer 2和Layer 3。每个层都像一个常规材质一样,拥有基色、法线贴图、光滑度和细节纹理等常见属性。
层按重要性排序,首先是最底部的材质,最后是最顶部材质。例如你可以在Layer 1中放入石头,在石头上面的Layer 2放入苔藓,然后在苔藓的上面放上累积的尘土作为Layer 3。尘土要比苔藓不重要,因为雨水能把它冲走。这种排序可使你在制作LOD材质时,移除最后一层。在本文的岩石示例中,苔藓被设置为了Layer 3,因此你可以在LOD材质中将它移除。
着色器的开销与层数和纹理数量有关。层数越多,开销越大。
你可以直接在分层着色器中设置层属性。不过,层着色器允许你直接从一个光照着色器复制属性到层。这可以在不同分层与光照着色器之间共享材质属性,以增添一些多样性。本文将介绍如何使用这个方法。
这个设置允许你更新一个光照着色器材质,并将其复制到不同的分层材质。不同的层根据美术人员设定的权重进行混合。可用于互相组合定义这些权重的选项有很多:顶点颜色、层遮罩和高度图遮罩。本文的例子中使用了一个层遮罩。
设置层遮罩
层遮罩可决定层的可见度。在导入纹理时,必须将其设为线性,且不勾选sRGB。它每个通道对应着一个层的可见度。
设置影响模式
前面提到,示例中的对象由一个主材质以及覆盖在主材质之上的可平铺材质组成。Main Layer Influence选项允许主材质影响其他层(层1、2、3)。这样主材质可以影响其它层的基色、法线与高度信息。启用Main Layer Influence会能减少平铺材质的重复性,并保持对象的外观。
你可以使用一个遮罩来过滤影响效果。
你可以单独控制每个层和每个组件的影响强度。
下图展示了在石头层上应用Main Layer Influence之后的视觉差异。
密度模式
你可以将基色纹理的Alpha通道设置为使用纹理透明度或纹理密度。具体做法是勾选或取消勾选每个层的Use Opacity map as Density map选项。
当启用Use Opacity map as Density map时,基色纹理将使用Alpha通道。
这个密度贴图决定了层中可见元素的密度。顶点颜色决定密度贴图的阈值。密度贴图是手工制作的灰度图。白色元素会先显示,黑色的最后显示。当通道的顶点颜色越趋近于1,其可见度就越高(红色通道:Layer 1、绿色通道:Layer 2、蓝色通道:Layer 3)。
注意:阈值是顶点颜色逆转的点。密度图内所有高于阈值的值都会使层可见。这是一个递进的过程,所以会存在逆转。
龙形岩分层材质示例
下面的截图展示了本文中龙形岩示例渲染所用的分层着色器设置。分层着色器上的Main Layer Influence选项已启用,以使主层能够对石头层产生影响。
龙形岩示例中的Main layer设置。
仅显示主层时的纹理。
下图展示了着色器中每个层的设置。地面元素和苔藓层的Use Opacity map as Density map都已启用。
石头层Layer 1的设置。
显示了岩石(主层)和石头(层1)的纹理。
龙形岩示例中地面层的层 2设置。
显示岩石(主层)、石头(层1)和地面元素(层2)的纹理。
龙形岩示例中苔藓层的层3设置。
显示岩石(主层)、石头(层1)、地面元素(层2)和苔藓(层3)的纹理。
下图展示了在游戏中应用光照后的一个效果示例。
未启用影响层模式的照片建模对象
你可以单独使用照片建模技术创作材质,并将其应用到虚拟对象之上。下面是一个有关地形的示例,在这个例子中,没有使用分层着色器的Main Layer Influence选项,而是使用了四种可平铺材质。
这创建了四种光照材质。
要设置可在HDRenderPipeline分层着色器中使用的纹理,你需要新建一个四层的分层着色器,并将其应用到地面对象上。你随后可以使用顶点颜色绘制地面对象。因为层的组织方式不同,因此顶点颜色也有不同。
将对象与地面融合
要融合连接二个无缝对象,它们必须使用同一种材质。
具体做法是,将共同材质的Base UV mapping 设置为 Planar,并将二个对象的设置为使用相同的World scale和 Tiling。
要获得完美的连接效果,可以在3D图形软件(例如3ds Max或Maya)中调整网格的法线。
小结
如何使用分层着色器实现最高质量的照片建模就为大家介绍到这里,后续我们介绍使用摄影测量技术的更多信息,尽情关注,更多Unity技术内容尽在Unity官方中文论坛(UnityChina.cn) !
技术课程直播
5月30日晚,新一期的Unity官方技术直播课程,Unity技术经理成亮将带你了解Unity 2018中的渐进光照贴图Progressive Lightmappe。
直播地址:
https://connect.unity.com/events/unitychina-progressivelightmapper
推荐阅读
Unity Labs : AutoLOD自动化性能提升的实验
点击“阅读原文”访问Unity官方中文论坛