项目升级Blender4.0后发现Principled BSDF整个重构了,改动非常大,虽然使用Blender4.0打开之前版本的Blender文件时,会有一个自动转换的过程,但是该过程并没有完全达到相同的效果,因此对改动前后的Principled bsdf做了学习和研究,以期望达到之前做的资产在4.0中也可以经过转换后实现和之前差不多的效果的需求。
学习资料
过程中阅读了很多相关资料,又学了一遍Disney Principled BSDF,学习的相关资料如下:
- https://zhuanlan.zhihu.com/p/60977923,毛星云老师在我学习的路上真的称得上先生千古。
- https://zhuanlan.zhihu.com/p/57771965
- https://wiki.blender.org/wiki/Reference/Release_Notes/4.0/Shading
- https://docs.blender.org/manual/zh-hans/3.6/render/shader_nodes/shader/principled.html
- https://docs.blender.org/manual/en/4.0/render/shader_nodes/shader/principled.html
Blender打开旧资产自动转换对应关系
我用我们项目中的工程文件进行了测试,用Blender4.0打开Blender3.6的文件(Blender会进行一些自动转换),得到的Principled BSDF前后的参数对应关系如下表:
参数区别总结
- 3.6 Base Color 和Subsurface两个颜色输入,Subsurface是浮点数输入。4.0 只有一个Base Color,自动添加了Mix Color节点,混合之前的两个输入作为Base Color的输入,该节点混合的Factor为原来的Subsurface输入(Clamp Factor)。
- Roughness和Normal连接不变。
- 3.6的Subsurface除了作为mix factor还会连接在4.0的Subsurface模块的Scale输入上。
- 3.6的Specular输入在4.0连接在Specular模块的IOR Level上。
- 3.6Sheen的值到4.0会有变化。
查看官方Release Notes和OSL Shader后发现的一些区别
- 3.6的bssrdf传入的参数直接是Roughness,4.0传入的是r2= Roughness*Roughness。
- Blender3.6中的Specular会参与到IOR的计算中,显式的IOR调节几乎没有效果,而Blender4.0中自动转换链接的IOR Level是一个线性放缩高光的接口。
- Blender3.6的Coat和Sheen图层几乎没有作用效果,但是Blender4.0重构了BSDF的分层设计,这两种效果现在也都比较明显。
解决方案
- 如果要和之前的效果尽量对齐,可以尝试手动把Sheen和Coat值调为0。
- 高光方面,如果要物理意义对齐,应该要手动通过Speuclar值计算IOR并连接到4.0的IOR节点,然后将IOR Level置为0.5,经过测试,这样手动转换之后确实会让效果变好,但是由于3.6到4.0的跨越本来就比较大,修改后也无法实现完全对齐,且效果差别不大。转换公式: $ IOR = \frac{2}{1-\sqrt{0.08*Specular}}-1 $。这里有一个0.08的系数是因为Blender3.6中就是把f0进行了这样的一个映射。
- Blender4.0传入的Roughness参数是经过平方计算后的,而Blender3.6传入的则是原始Roughness,但是经过测试后,发现该值对Roughness的影响并不大,考虑到Blender4.0的release notes里面写设计更偏向于基于物理的真实,因此我觉得这个参数也不需要手动修改。
这次主要学习到和梳理清楚的新知识有:
- BRDF材质图像切片的空间原理(Slice Space)
- 接触到掠射逆反射的概念
- Metallic这个参数是用来控制材质的金属度的,它的原理是对金属材质和非金属材质两种不同的计算方式得到的结果以该值为权重进行线性插值。
- PBR在工业界有两种工作流程,在金属/粗糙度工作流程中,只有一张BaseColor贴图,里面同时包含了电介质的漫反射颜色和金属的F0两种数据,而Metallic贴图相当于一张Mask,控制了哪些地方把它当成金属,哪些地方当成电介质计算。
- Blender3.6中可以显式地控制Specular值,原理为“介电镜面反射量。指定面向(沿法线) 反射率在最常见的 0 - 8% 范围内。”,bsdf计算中通过该值计算得到ior。Blender4.0中取消了原来的Specular接口,而更物理地直接使用IOR控制,因此我在材质节点中手动增加节点组从原来的F0值计算得到ior。
- Blender4.0对Principled BSDF进行了重新的分层建模,不同层之间有并列关系也有覆盖关系: