认识DiffuseAndSpecularFromMetallic和UNITY_BRDF_PBS
首先要明确这个函数的目的是啥?
在学习金属流还是镜面反射流的时候:https://catlikecoding.com/unity/tutorials/rendering/part-4/
下面是金属流的设置情况。
用一个滑动条来金属的程度
也就是说metalic值越大,那么材质就越金属。理论上:
漫反射系数=1-metailic
镜面反射系数-metallic
但是文中提到,即使是非金属也有一定程度的镜面反射,所以不是1-metallic那么绝对。
另外原因还考虑都收到颜色空间的影响,所以,unity提供了一个DiffuseAndSpecularFromMetallic用来计算漫反射颜色和漫反射系数。
原型如下:
inline half OneMinusReflectivityFromMetallic(half metallic) {
// We'll need oneMinusReflectivity, so
// 1-reflectivity = 1-lerp(dielectricSpec, 1, metallic)
// = lerp(1-dielectricSpec, 0, metallic)
// store (1-dielectricSpec) in unity_ColorSpaceDielectricSpec.a, then
// 1-reflectivity = lerp(alpha, 0, metallic)
// = alpha + metallic*(0 - alpha)
// = alpha - metallic * alpha
half oneMinusDielectricSpec = unity_ColorSpaceDielectricSpec.a;
return oneMinusDielectricSpec - metallic * oneMinusDielectricSpec;
}
inline half3 DiffuseAndSpecularFromMetallic (half3 albedo, half metallic,out half3 specColor, out half oneMinusReflectivity
) {
specColor = lerp(unity_ColorSpaceDielectricSpec.rgb, albedo, metallic);
oneMinusReflectivity = OneMinusReflectivityFromMetallic(metallic);
return albedo * oneMinusReflectivity;
}
此函数返回的是漫反射颜色,加上两个out其实共计有三个返回值。
然后我们要知道:UNITY_BRDF_PBS
这个函数的目的是解决啥的呢?上面的金属流或者是镜面反射流最终效果,对于非金属材质效果很模糊,所以为了提高表现效果,unity提供了一个基于物体的渲染算法,其更加真实,更加可预测。
具体的可参看:https://catlikecoding.com/unity/tutorials/rendering/part-4/ 第5节的内容。
这里我们只是明确这两个函数存在的目的是啥。
明确unity对于漫反射和镜面反射提供了两种工作流。
其中金属流使用起来更加容易些,因为只需要一个slider就能控制金属程度。
其次,unity为了效果真是提供了DiffuseAndSpecularFromMetallic和UNITY_BRDF_PBS两个函数。