!!!バックライト表現 光源の向きと逆方向にも光を与えることで、バックライト的な表現を行うShaderです。 テクスチャのアルファに対応。 backLight.shader Shader "Custom/backLight" { Properties { _MainTex ("Base (RGBA)", 2D) = "white" {} _Cutoff ("Alpha cutoff", Range(0, 1)) = 0.9 } SubShader { Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} LOD 200 Blend SrcAlpha OneMinusSrcAlpha // アルファを使用する. CGPROGRAM // LightingSimpleLambertを呼び出すために必要。最後のalphatest:_Cutoffを忘れずに. #pragma surface surf SimpleLambert alphatest:_Cutoff half4 LightingSimpleLambert (SurfaceOutput s, half3 lightDir, half atten) { float NdotL = dot(s.Normal, lightDir); if (NdotL < 0.0f) NdotL = (-NdotL) * 0.5f; // 裏面からのライティングを補正. half diff = NdotL; half4 c; c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten * 2); c.a = s.Alpha; return c; } sampler2D _MainTex; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { half4 col = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = col.rgb; o.Alpha = col.a; } ENDCG } Fallback "Transparent/Diffuse" } 「_Cutoff ("Alpha cutoff", Range(0, 1)) = 0.9」で、アルファが0.9以下の場合にピクセル単位で透過。 #pragma surface surf SimpleLambert alphatest:_Cutoff の行の最後の「alphatest:_Cutoff」の指定を忘れずに。これがないと、ピクセル単位の透過が正しく動作しません。 これらのオプションについては http://docs-jp.unity3d.com/Documentation/Components/SL-SurfaceShaders.html を参照。 LightingSimpleLambert 組み込み関数で、 float NdotL = dot(s.Normal, lightDir); if (NdotL < 0.0f) NdotL = (-NdotL) * 0.5f; の行でDiffuse値の計算(法線と光線での内積)を行い、後ろ向きの場合は法線を反転させて少しDiffuseを与えています。 ---- {{lastmodified}}