Tags{ "LightMode"="ForwardBase" } CGPROGRAM #include "Lighting.cginc" fixed4 _Diffuse;//假装是物体的自身颜色 struct a2v{ float4 v:POSITION; float3 nor:NORMAL; }; struct v2f{ float4 position:SV_POSITION; float3 col:COLOR0; }; #pragma vertex vert #pragma fragment frag v2f vert(a2v v){ v2f f; f.position = UnityObjectToClipPos(v.v); //计算光颜色 fixed3 norDir = normalize((fixed3) mul(unity_ObjectToWorld,float4(v.nor,0))); fixed3 lightDir = normalize( _WorldSpaceLightPos0.xyz ); fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//环境光 f.col = _LightColor0.rgb * max(dot(norDir,lightDir),0) * _Diffuse + ambient; return f; } fixed4 frag(v2f f):SV_Target{ return fixed4(f.col,1); } ENDCG
内置变量和方法:
UnityObjectToClipPos(pos) 其实就是:mul(UNITY_MATRIX_MVP,pos),变换模型坐标到裁剪坐标
unity_ObjectToWorld就是_Object2World,模型坐标到世界坐标的变换矩阵
_WorldSpaceLightPos0.xyz 就是第一个平行光的位置(方向)
_LightColor0.rgb 就是第一个平行光的颜色
UNITY_LIGHTMODEL_AMBIENT.rgb 环境光的颜色
normalize() 单位化向量的方法
max() 返回参数中的较大值
dot() 向量的点积