///逐像素漫反射
Shader"unity shader book/chapter 6/Diffuse Vertex_Leve2"{
properties{
_Diffuse("Diffuse",Color) = (1,1,1,1)
}
Subshader{
pass {
Tags{"LightMode "= "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include"Lighting.cginc"
fixed4 _Diffuse;
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f {
float4 pos:SV_POSITION;
float3 worldNormal:COLOR;
//float3 worldNormal:TEXCOORD0;
};
//与逐顶点漫反射不同,顶点着色不需要计算光照模型,只需要把世界空间下的法线传递给片元着色器即可
v2f vert(a2v v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.worldNormal = mul(v.normal, (float3x3)_World2Object);
return o;
}
//与逐顶点漫反射不同,漫反射部分的计算不在顶点着色器中进行,在片元着色器中进行
fixed4 frag(v2f i) :SV_Target{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal, worldLightDir));
fixed3 color = ambient + diffuse;
return fixed4(color, 1.0);
}
ENDCG
}
}
Fallback"Diffuse"
}
红色内是逐顶点漫反射的,绿色的是逐像素漫反射的。
逐顶点和逐像素的漫反射主要区别在于顶点的漫反射计算写在顶点着色器中,片元着色器只返回顶点雅颜色即可。
像素漫反射计算的写在片元着色器中,顶点着色器只要需要传递法线的信息给片元着色器就好