- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!バックライト表現
光源の向きと逆方向にも光を与えることで、バックライト的な表現を行う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}}