トップ 一覧 検索 ヘルプ 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を与えています。

----
{{lastmodified}}