フォン鏡面反射をつくります
ランバード拡散をもとに拡張していきます
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" }
フォン鏡面反射モデルのノード
で、でかい…
ランバード拡散でもやった光源の向きを計算する部分です。
法線ベクトルと掛け合わせます。ここまでは前回と同じですね。
反射光の部分です。Normalを2倍し、NdotLと掛け合わせ、マイナスをかけたライトの向きに足し合わせています。
視線ベクトルと掛け合わせます。反射光の強さをPowerで調整する部分ですが、ここはVector1のPropertyをつくりInspectorから調整できるようにしています。
ランバート拡散でつくった色に反射光を足しています。
足す先はUnlitノードにしています。UnlitとはScene中においてある光の影響を受け付けません。しかしながら、Shaderでこのように光がない環境でも光があたっているように表現することができました。
ブリンフォン鏡面反射モデルのノード
元のモデルに少し変更を加えてやります。変更箇所です。
ハーフベクトルを求めます。ハーフベクトルはライトの方向と視線方向のベクトルを足し合わせたものの単位ベクトルです。
反射は、ハーフベクトルと法線ベクトルの近さによって決まりますので、ハーフベクトルと法線ベクトルで内積をとります。あとは同じです。
反射が荒くなりました。