漫反射光照模型
何为漫反射呢?即指光线被粗糙表面无规则地向各个方向反射的现象。通俗一点就是相对高光而言,没有刺眼的光斑产生.
首先我们给出漫反射部分计算公式:Cdiffuse=(Clight*Mdiffuse)max(0,n*l)
主要我们看看漫反射模型的shader代码:
Properties{
_Diffuse("Diffuse",Color)=(1,1,1,1)
}
这里我们定义了一个属性即漫反射颜色_Diffuse设置为(1,1,1,1)白色。
SubShader{
Pass{
Tags{"LightModel"="ForwardBase"}
我们在管线里面定义了通道,通道里面再定义了一个标签,只有这样我们才能使用内置光照,比如LightColor0等。
代码如下:
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Diffuse;
上面定义了两个着色器vertex定点着色器和fragment片元着色器,然后引用Unity内置灯光效果文件,以及定义了一个属性的类型_Diffuse.
struct a2v {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 pos : SV_POSITION;
fixed3 color : COLOR;
};
使用两个结构体定义了定点着色器和片元着色器所需的一些变量。
v2f vert(a2v v) {
v2f o;
// Transform the vertex from object space to projection space
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
// Get ambient term
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
// Transform the normal from object space to world space
fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));
// Get the light direction in world space
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
// Compute diffuse term
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));
o.color = ambient + diffuse;
return o; }
fixed4 frag(v2f i) : SV_Target {
return fixed4(i.color, 1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
上面就是顶点着色器和片元着色器的具体实现,由于我们上面采用的是逐顶点光照的,所以片元着色器直接输出即可,运行结果如下: