土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

ForwardAdd Passのコードを書く際の注意点

 以前から、スポットライトを受けるシェーダーを検証している最中に、プレーンが変な形に切り抜かれることがあって、これはいったいなんなんだろうと思っていたのですが、ようやく「そのライトが当たらないフラグメントについては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
		}
	}
}

 結果はこうなります。そうそうこれこれ。この変な範囲描画が気になってたのです。

 結構前から気になっていた事だったので、わかってホッとしました。