希望實現一個根據攝像機朝向與網格法向關系控制光照亮度的雙面shader。
代碼如下
Shader "Custom/UnlitOP" { Properties{ _Color("Main Color", Color) = (1,1,1,1) //渲染需要外部設置的顏色 _MainTex("Base (RGB)", 2D) = "white" {} //材質 _CamDir("Camera Dirction",Vector) = (0.1,0.2,0.3,0.4) //攝像機的朝向 } SubShader{ Tags{ "RenderType" = "Opaque" "Queue" = "Geometry"} ZWrite On LOD 200 Cull Off //雙面shader CGPROGRAM #pragma surface surf myLightModel //用了自定義的光照模型 sampler2D _MainTex; float4 _Color; float4 _CamDir; //攝像機朝向變量 //命名規則:Lighting接#pragma suface之后起的名字 //lightDir :點到光源的單位向量 viewDir:點到攝像機的單位向量 atten:衰減系數 float4 LightingmyLightModel(SurfaceOutput s, float3 lightDir, half3 viewDir, half atten) { float4 c; float3 cr; cr = _CamDir.xyz; float diffuseF = max(0, abs(dot(s.Normal, cr)/2.0)); //由於是雙面shader,所以正反面的顏色應該一樣,否則會不同,/2是讓dot結果在0-1之間。 c.rgb = s.Albedo*_LightColor0.rgb*(diffuseF); //_LightColor0是內置的屬性,應該跟當前光照有關。 c.a = s.Alpha; return c; } struct Input { float2 uv_MainTex; float4 _Color; }; void surf(Input IN, inout SurfaceOutput o) { //half4 c = tex2D(_MainTex, IN.uv_MainTex)*_Color; o.Albedo = _Color.rgb; o.Alpha = _Color.a; } ENDCG } FallBack "Diffuse" }
下面是有透明效果的版本,基本一樣,就是要注意Tags的寫法,以及關閉ZWrite,開啟Ztest,使用Blend。另外在調試中發生了一點意外,完全一樣的代碼,開始時始終透明物體被渲在了所有不透明物體后面,怎么改代碼都沒用,后來將材質的shader都改成standard試試好用,再改回來就正常了。這點事弄了半下午......
Shader "Custom/UnlitTR" { Properties{ _Color("Main Color", Color) = (1,1,1,1) _MainTex("Base (RGB)", 2D) = "white" {} _CamDir("Camera Dirction",Vector) = (0.1,0.2,0.3,0.4) } SubShader{ Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" } ZWrite Off ZTest On LOD 200 Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma surface surf myLightModel alpha sampler2D _MainTex; float4 _Color; float4 _CamDir; //命名規則:Lighting接#pragma suface之后起的名字 //lightDir :點到光源的單位向量 viewDir:點到攝像機的單位向量 atten:衰減系數 float4 LightingmyLightModel(SurfaceOutput s, float3 lightDir, half3 viewDir, half atten) { float4 c; float3 cr; cr = _CamDir.xyz; float diffuseF = max(0, abs(dot(s.Normal, cr) / 2.0)); c.rgb = s.Albedo*_LightColor0.rgb*(diffuseF); c.a = s.Alpha; return c; } struct Input { float2 uv_MainTex; float4 _Color; }; void surf(Input IN, inout SurfaceOutput o) { //half4 c = tex2D(_MainTex, IN.uv_MainTex)*_Color; o.Albedo = _Color.rgb; o.Alpha = _Color.a; } ENDCG } FallBack "Diffuse" }