デコシノニッキ

ホロレンジャーの戦いの記録

独習ShaderGraph その11 フォン鏡面反射とブリンフォン鏡面反射をつくる

前回
www.tattichan.work

フォン鏡面反射をつくります
ランバード拡散をもとに拡張していきます
nn-hokuson.hatenablog.com

フォン鏡面反射モデルのシェーダ

"Custom/Phong" {

	SubShader{
		Tags{ "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
#pragma surface surf SimplePhong
#pragma target 3.0

		struct Input {
		float2 uv_MainTex;
	};


	void surf(Input IN, inout SurfaceOutput  o) {
		o.Albedo = fixed4(1,1,1,1);
	}

	half4 LightingSimplePhong(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
	{
		//光の進む方向と面とが垂直に近ければ近いほど明るくなる
		half NdotL = max(0, dot(s.Normal, lightDir));
		//反射光
		float3 R = normalize(-lightDir + 2.0 * s.Normal * NdotL);
		//反射ベクトルRと視線ベクトルviewDirがどれだけ近いか
		//指数を大きくすればするほどハイライトの減衰が速くなり、ピンポイントで光るようになる
		float3 spec = pow(max(0, dot(R, viewDir)), 10.0);

		half4 c;
		//ランバード拡散の式にspecを足す
		c.rgb = s.Albedo * _LightColor0.rgb * NdotL + spec + fixed4(0.1f, 0.1f, 0.1f, 1);
		c.a = s.Alpha;
		return c;
	}
	ENDCG
	}
		FallBack "Diffuse"
}

f:id:haikage1755:20180218095030p:plain:w250

フォン鏡面反射モデルのノード

で、でかい…
f:id:haikage1755:20180218095254p:plain:w350

ランバード拡散でもやった光源の向きを計算する部分です。
f:id:haikage1755:20180218095418p:plain:w250

法線ベクトルと掛け合わせます。ここまでは前回と同じですね。
f:id:haikage1755:20180218095612p:plain:w250

反射光の部分です。Normalを2倍し、NdotLと掛け合わせ、マイナスをかけたライトの向きに足し合わせています。
f:id:haikage1755:20180218095737p:plain:w250

視線ベクトルと掛け合わせます。反射光の強さをPowerで調整する部分ですが、ここはVector1のPropertyをつくりInspectorから調整できるようにしています。
f:id:haikage1755:20180218100121p:plain:w250

ランバート拡散でつくった色に反射光を足しています。
f:id:haikage1755:20180218100254p:plain:w250

足す先はUnlitノードにしています。UnlitとはScene中においてある光の影響を受け付けません。しかしながら、Shaderでこのように光がない環境でも光があたっているように表現することができました。
f:id:haikage1755:20180218100335p:plain:w250

f:id:haikage1755:20180218100616g:plain:w250

ブリンフォン鏡面反射モデルのノード

f:id:haikage1755:20180218102320p:plain:w350

元のモデルに少し変更を加えてやります。変更箇所です。
f:id:haikage1755:20180218102302p:plain:w250

ハーフベクトルを求めます。ハーフベクトルはライトの方向と視線方向のベクトルを足し合わせたものの単位ベクトルです。
f:id:haikage1755:20180218102416p:plain:w250

反射は、ハーフベクトルと法線ベクトルの近さによって決まりますので、ハーフベクトルと法線ベクトルで内積をとります。あとは同じです。
f:id:haikage1755:20180218102623p:plain:w250

反射が荒くなりました。
f:id:haikage1755:20180218102710p:plain:w250

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」