UNITYシェーダ研究 複数ライトの影響
コード
https://github.com/YukiMiyatake/UnityLesson/tree/Shader_6
前回まで
前回はAmbientも入れて だいたいライティング出来た
ただ、複数ライトを置いても1つ目のライトの影響しか受けない
ので、複数ライトの影響をうけるようにする
ライトの強さ
複数ライト対応するまえに、今までのライトではライトカラーの影響はうけるが
ライトの強さの影響が入っていないので追加する
ライトの種類により減衰しないライト(DirectionalLightなど)と 減衰するライト(PointLight等)があり
それらをまとめて計算するマクロが存在するので それを使う
AutoLight.cginc をIncludeし、LIGHT_ATTENUATION(i) でライトの強さが取得できる iはピクセルデータ
それをライトカラーに乗算することで、強さを反映したライト色が計算できる
float3 lightCol = _LightColor0.rgb * LIGHT_ATTENUATION(i);
ライトカラーは、ディフューズとスペキュラに影響するので、それぞれに乗算する
float3 diffuse = (NdotL*0.5 + 0.5) * lightCol; float3 specular = pow(max(0.0, dot(H, N)), _Spec1Power) * _Spec1Color.xyz * lightCol; // Half vector
複数ライトに対応
UNITYでは、キャラに最も影響の強いライトは LightMode=ForwardBaseで計算するが
その他のライトは LightMode=ForwardAddで入ってくる
ので、ForwardAddのパスを増やせばいい
シェーダーの中身は 今回はほぼ、ForwardBaseのものをコピーする
ただし、Ambientは1回しか計算してはいけないので ForwardAddでは計算行わない事と
BlendModeを One Oneなどにしなければ、合成されない
BlendMode設定なし
メインライトのみ
ライト2個(赤ライト追加)
()
複数ライトが反映されるようになった