Substance Painter Shader与UE4移动端渲染效果同步

要为UE4项目编写SP的Shader,首先得把MobileBasePassXXX.usf翻出来。然后将通用的直射光 漫反射+ 高光 + Skylight + IBL全拿出来,再和特殊材质如SSS、Aniso等材质编辑器中的Shader拿出来,组合一下,就完成了。

参考了Substance Painter提供的示例Shader。很快就熟悉了SP的Shader编写方式。

这里给个超简洁的 SP Shader示例:https://github.com/ianbanks/arma_3_substance_shader

然后经过长时间的摸索和涛哥指导,SP Shader注意项:

  1. IBL计算必须和UE4 中的一样。绝对不能使用Substance Painter提供pbrComputeSpecular,差距非常的大,SP这个函数用了多次重要性采样积分,效果好得不得了。UE4 Mobile 的IBL就根据Roughness采样Cubemap lod,然后简单平方乘上一个亮度值,非常的搓。
  2. 环境贴图使用LDR,UE4 Mobile的光照图就是LDR,HDR会相对过曝了,美术他们绘制时可能会因为HDR关系把BaseColor亮度级别拉得相对较暗,导入引擎时有差距。
  3. 必须写在同一个Shader中。我一开始直接写了个模板,然后python根据输入参数不同生成不同的shader文件,比如皮肤一个,头发一个,丝绸一个。这导致模型进SP时得分开材质,导出时贴图没办法合并在一起。虽然可以在Substance Designer中合并贴图,但是SP导出时必须将填充像素减少到 1- 2。否则合并时UV岛会相交。然后这也会导致另外一个问题,合并完后UV岛边界填充少,贴图Mipmap会有texture bleeding现象,也就是远处有道缝。必须在python里再扩充一次UV岛,虽然问题最后解决了,但这美术工序越来越复杂了,最终只好全部写在一个Shader中,让美术额外绘制材质遮罩好了。
  4. ToneMapper部分也要加上去,直接写在Shader中就好了,因为调色影响很大,UE4的ToneMapper是他改过的Film函数,我直接Copy过来一个字都没改,当然需要注意改一下DX和Opengl矩阵的行列主序问题和矩阵乘法部分。

最后记录我想出来的一个简单UV岛扩张的算法:

  1. 计算当前贴图的黑白剪影。对黑白剪影做一次图像膨胀操作。得到扩展图。
  2. 然后对黑白剪影做一次边缘检测操作,记录所有边缘的rgb值。
  3. 将边缘的rgb值填充到剪影的膨胀区域上去。

简单快速,使用python opencv库一下子就搞定了。

最后:

SP与UE4一直有一个奇怪的色差问题,两者的颜色饱和度区间并不相同,我坚信是IBL的差异,然后使用了同一套IBL SPECULAR后,确实减少了很多差异,但色差还是有的,我无法解决这个问题。

© - 2024 · 月光下的旅行。 禁止转载