Shader "Unlit/ForwardRendering" { Properties { } SubShader { Tags { "RenderType"="Opaque" } LOD 100 //第一个重要的平行光,计算环境光和自发光 Pass { Tags{"LightMode" = "ForwardBase"} CGPROGRAM #pragma multi_compile_fwdbase #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" struct appdata { float4 vertex : POSITION; float3 normal:NORMAL; }; struct v2f { float4 vertex : SV_POSITION; float3 worldNormal : COLOR0; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.worldNormal = mul(unity_ObjectToWorld, v.normal); return o; } fixed4 frag (v2f i) : SV_Target { fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//环境光,Base这里计算一次 float3 worldLightDir = normalize(_WorldSpaceLightPos0); fixed3 diffuse = _LightColor0.rgb * max(0, dot(i.worldNormal, worldLightDir)); return fixed4(ambient + diffuse,1); } ENDCG } //计算其他逐像素光照 Pass { Tags{ "LightMode" = "ForwardAdd" } Blend One One //混合 CGPROGRAM #pragma multi_compile_fwdadd #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" #include "AutoLight.cginc" //unity_WorldToLight struct appdata { float4 vertex : POSITION; float3 normal:NORMAL; }; struct v2f { float4 vertex : SV_POSITION; float3 worldNormal : COLOR0; float4 worldPos :COLOR1; }; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.worldNormal = mul(unity_ObjectToWorld, v.normal); o.worldPos = mul(unity_ObjectToWorld, v.vertex); return o; } fixed4 frag(v2f i) : SV_Target { //光照方向 #ifdef USING_DIRECTIONAL_LIGHT fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz); #else fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz); #endif //计算光照衰减 #ifdef USING_DIRECTIONAL_LIGHT fixed atten = 1.0; #else float3 lightCoord = mul(unity_WorldToLight , float4(i.worldPos.xyz, 1)).xyz; fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL; #endif fixed3 diffuse = _LightColor0.rgb * max(0, dot(i.worldNormal, worldLightDir)); return fixed4(diffuse,1)* atten ; } ENDCG } } }