首先,我们需要分别在SP和Unity里搭建一个相同的场景。本小节对应的资源路径为LookdevCalibration\MeetMat_Substance\1_Setup.spp和LookdevCalibration\MeetMat_Unity\Scenes\1_Setup.unity。
这两个场景的搭建环境如下:
- 都使用了同一个HDRI图像作为光照来源(来源:HDRI Haven的Artist Workshop)
- 都使用了同一套模型和贴图(来源:Sketchfab的Meet MAT 2 Mesh)
将上述HDRI、模型和贴图分别导入SP和Unity后,两者的项目设置分别如下:
1. Substance Painter设置:
- 在Environment Settings里进行设置(参见图1),以正确设置SP的环境光部分。
- 确保关闭Camera Settings里的所有后处理(参见图2),以排除后处理对渲染结果的影响。
- 确保材质使用的Shader是pbr-metal-rough(参见图3),并把相应贴图赋给对应的通道上。
2. Unity设置:
- 确保项目的颜色空间为Linear(参见图4),以保证我们能在线性空间下进行计算和渲染。
- 在项目ProjectSettings/GraphicsSettings.asset里将m_LightsUseLinearIntensity设为1,以保证我们能正确读取光源面板上的光源颜色和亮度信息。
- 设置相机位置和参数(例如FOV等)以保证和SP保持一致。
- 设置天空球。为了便于读者完全理解整个系统的原理,我们选择使用自己编写的Skybox Shader(LookdevCalibration\MeetMat_Unity\Assets\Shaders\CustomSkybox.shader)来创建天空球材质。这个Shader的基本逻辑与Unity内置的Skybox/Panoramic完全相同,只是去掉了无关的功能和Unity的兼容性代码。在Lighting Settings里把我们的天空盒材质球设置到Skybox Material属性上(参见图5)。如果读者使用的是Unity默认的Skybox/Panoramic材质,则需要注意要想让Skybox的颜色无偏地来自于HDRI,需要保持材质属性Exposure为1、Tint为(0.5, 0.5, 0.5)。这是因为,可能是出于某些历史版本的效果兼容原因,Unity会在Skybox/Panoramic的代码里把颜色值乘以unity_ColorSpaceDouble,因此我们要保证材质属性为0.5才能与其抵消。
- 设置模型材质球。这里我们暂时使用Unity内置的Standard Shader(参见图6)。
- 点击Lighting Settings里的Generate Lighting,来让Unity根据我们设置的HDRI正确计算相应的Ambient SH和Reflection Map,这是让Shader能读取到正确光照参数的关键。
按照如上进行设置后,我们可以在SP和Unity里得到效果非常相近的结果,如下图所示:
左图:Substance Painter的1_Setup场景,右图:Unity的1_Setup场景这看上去似乎很像!但现实是,此时我们没有添加任何Tone Mapping等后处理计算。与此同时,绝大多数情况下我们会根据项目需要定制Shader,而不会直接使用自带的Standard Shader。在这些情况下,仅使用上述设置就无法保证在两个环境中可以得到一致的效果。在下面的内容里,我们会学习如何解决这些问题。
网友评论