トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

unity_shader_back_light

バックライト表現


光源の向きと逆方向にも光を与えることで、バックライト的な表現を行う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を与えています。


最終更新時間:2013年11月23日 23時14分02秒