以前から、スポットライトを受けるシェーダーを検証している最中に、プレーンが変な形に切り抜かれることがあって、これはいったいなんなんだろうと思っていたのですが、ようやく「そのライトが当たらないフラグメントについてはForwardAddパスが実行されない」のだと気づきました。なぜこんな簡単な事に気づかなかったんだ……。
上記を検証するために下記の最小限のサンプルコードを作りました。フラグメントの座標を問わずfloat4(1.0, 1.0, 1.0, 1.0)を返していますが、これを適用したメッシュにスポットライトを当てると、当て方によって一部分が描画されません。つまり、そこは処理が飛ばされています。
Shader "Unlit/NewUnlitShader 1" { SubShader { Tags{ "LightMode" = "ForwardAdd" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" uniform sampler2D _LightTextureB0; float4 vert(in float4 pos : POSITION) : SV_POSITION { return UnityObjectToClipPos(pos); } fixed4 frag() : SV_Target { return float4(1.0, 1.0, 1.0, 1.0); } ENDCG } } }
結果はこうなります。そうそうこれこれ。この変な範囲描画が気になってたのです。
結構前から気になっていた事だったので、わかってホッとしました。