Unity3D - 伪BRDF着色器

通常,当光照射在材质表面时会发生三种变化:反射、被吸收和透射。若该材质为不透明,那么光的变化就减少为两种:反射和被吸收。

当一个观察者在观察一个被光照亮的不透明材质时,他看到的只有经过材质反射并朝向他的反射光。而BRDF就是描述当光照射在确定物质表面时,有多少光被反射的函数。

一个被点光源照亮的茶壶,茶壶的一些位置有一些亮斑。当观察者移动时,这些亮斑会发生变化。当观察者和茶壶的位置保持不变,而移动光源的位置,亮斑也会变化。

一般来说,反射光的强度取决于观察者、光源位置、入射点和该点的表面切线角度。

此外,当光线作用到物体表面时,不同波长(颜色)的光在被吸、反射和透射时跟光本身的性质也有关。而光照射在表面不同区域时发生的相互作用也不同。不同材质,比如木质材料。在被光照射时会有一些条带化(striping)或者 ringing的效果。许多材质表现出这些变化主要原因是因为物体表面通常不是由单一材质组成的。而现实生活中物体的材质组成往往是错综复杂的。


伪BRDF着色器

在上一部分中,我们通过梯度贴图的形式描绘物体表面受光照影响后的漫反射颜色变化。而这一部分,我们把观察者因素也考虑进来。利用以下光照函数,加入观察者因素:

half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten){}

上一部分中,我们只使用了梯度贴图上一个方向的颜色变化,所以我们的光照效果实际上是一个线性变化。当在加入观察者角度后,我们将利用纵坐标的颜色变化来模拟随着观察者角度变化对光照效果的影响。

在这张图里,自左下角至右上角沿对角线方向有一个颜色渐变。同时,左上角沿着对角线方向到图片一半位置和右下角沿着对角线方向到图片一半的位置也有颜色渐变。

现在我们来修改光照模型,函数参数里,加入viewDir:

inline float4 LightingBasicDiffuse (SurfaceOutput s, fixed3 lightDir,half3 viewDir, fixed atten)

计算我们用于y轴方向上梯度颜色取值的变量rimLight

float rimLight = dot (s.Normal, viewDir);

最后,修改我们用于取样的text2D函数,修改模拟顶点UVs的值.float2(hLambert,rimLight)

            float3 ramp = tex2D(_RampTexture,float2(hLambert,rimLight)).rgb;

Comments