- 关于PBR
PBR即基于物理的渲染,是一套尝试基于真实世界光照物理模型的渲染技术合集,使用了一种更符合物理学规律的方式来模拟光线,达到更真实的渲染效果,而且可以直接通过物理参数来直观地达到想要的结果,不用通过拙劣的各种参数调整。物理参数一般直接通过贴图来传递给Shader。
2.关于Substance
Substance是Allegorithmic公司的一套PBR美术制作工具,包括Substance Printer和Substance Designer等软件,Substance Painter是PBR贴图绘制软件,
我们可以导入自己的模型,然后绘制输出PBR贴图。而Substance Designer可以输出sbsar文件,sbsar描述了PBR贴图的生成方式,可以导入Substance Painter为材质,也可以直接给Unity使用(Unity2018版本以上需要额外的插件)。在Unity里使用sbsar文件,我们就可以直接在Unity里调参数生成新的PBR贴图。
上图选中的就是一个sbsar文件,包含了5种材质以前材质使用的贴图。
上图是Gold材质的属性面板,我们可以看到有Metal Properties和Age 这类的自定义参数,调整这些参数,就能重新生成新的PBR贴图。
(使用Gold材质的渲染结果)
sbsar文件除了动态生成PBR贴图这个功能,其实与Unity材质没有差别,因为它们都是使用相同的Shader。仅仅使用它的贴图我们也可以渲染出完全一样的效果。
Substance Painter比较重要的注意点是导出贴图的设置,通常我们将Config设置为Unity5(Standard Metallic)
而Unity5(Standard Metallic)的配置我们可以在上面CONFIGURATION中查看和修改:
如图,我们将为每套贴图输出Albedo,Normal,Emission,Metallic4张贴图,Albedo的RGB通道使用Base Color的RGB颜色,Normal的RGB通道是NormalOpenGL的RGB颜色,而Metallic的RGB通道使用Metallic的灰度颜色,A通道使用Roughness的灰度颜色(这是我修改后的配置,默认配置不是这样)。
3.整合到Unity开发流程的问题
实际开发中必定会存在的一个问题是,美术在Substance Painter中调出了一个牛逼哄哄的效果,开开心心地导入Unity,发现效果不一样了!除了一些光照的设置,最主要的是因为Color Space的问题。关于Color Space的概念可以看下这两篇文章:
Gamma & Linear Color Space 和 GAMMA AND LINEAR SPACE - WHAT THEY ARE AND HOW THEY DIFFER
这是Unity中不同Color Space渲染SP的PBR贴图的结果,第一张的Gamma Space,第二张是Linear Space,可以看出差异还是挺明显的,特别是底座的颜色
SP的渲染是在Linear Space中进行的,导出的贴图经过了gamma encoding,如果在Unity中使用Linear Space渲染,渲染结果还是很接近SP中的效果的,但是Linear Space不仅消耗高,而且在某些移动平台上不支持(需要OpenGL ES3.0以上及Metal图形API支持),这意味着我们需要在Gamma Space中得到跟SP一样的渲染效果。
With Unity 5.5, linear rendering is now available on Android and iOS. On Android, linear rendering requires OpenGL ES 3 graphics API which represents 61.1% of the Android devices. On iOS, linear rendering requires Metal graphics API which represents 71.1% of the iOS devices.
4.Substance Printer与Unity Gamma Space渲染效果一致化方案
方案1:修改Unity Standard Shader,手动加入gamma校正,使其达到Linear Space的效果。
Although Unity does not support the default linear pipeline on some platforms such as mobile. It is possible to do so yourself within shaders. This is done by applying the pow() function to gamma corrected input textures to transform the inputs to linear space, and applying pow() again before returning the result to put it back in gamma space. Note that this method will be computationally expensive, so be aware of the capabilities of your target devices and use it only where needed.
Unity提供了在UnityCG.cginc头文件中提供了GammaToLinearSpace和LinearToGammaSpace 两个方法进行两个空间的转化。但是我尝试了仍然没法得到Linear Space的渲染效果,颜色偏差还是存在,而且因为工作流程而加入额外的性能消耗,我觉得不是好方案,于是放弃这个方案。
方案2:不再调整Unity的渲染,我们调整SP的渲染,让其使用Gamma Space渲染。幸好SP支持自定义Shader
这篇文章提供了这个方案:点击打开链接,同时提供了一个模拟Unity PBR渲染的GLSL文件,下载下来,在SP中File->Impoty resources导入,在SHADER SETTINGS中设置为使用该shader,注意把Linear Space勾选去掉,因为我们要使用Gamma Space。导出贴图时,注意要修改Metallic贴图的设置:RGB通道使用Metallic的灰度颜色,A通道使用Roughness的灰度颜色。
Untiy中的和SP中,差异算可以接受了