🐼

Single Pass InstancedでGrabPass取得できない時の対処

2022/06/20に公開

経緯

vrchatのunity2020化に向けて自作シェーダーのSingle Pass Instanced対応をしようとした中で、GrabPassが取得できず灰色になったときの対応の備忘録

現象 (GrabPassで色反転させるシェーダーの例)

  • Multi Pass時の表示
  • Single Pass Instanced時の表示

確認したUnityのバージョン

バージョン
2019.4.31f1

解決方法

UNITY_DECLARE_SCREENSPACE_TEXTUREUNITY_SAMPLE_SCREENSPACE_TEXTUREを使う。

https://forum.unity.com/threads/shader-shows-different-when-using-single-pass-instanced.1099975/

具体的に

NGシェーダー
...
GrabPass {"_PandaGrabNg"}

Pass
{
	...
	sampler2D _PandaGrabNg;
	float4 _PandaGrabNg_ST;
	...
	fixed4 frag(v2f i): SV_Target
	{
		UNITY_SETUP_INSTANCE_ID(i);
		UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
		
		fixed4 col = tex2D(_PandaGrabNg, i.grabUv);
		return (1 - col);
	}
}
OKシェーダー
GrabPass {"_PandaGrabOk"}

Pass
{
	...
	UNITY_DECLARE_SCREENSPACE_TEXTURE(_PandaGrabOk);
	...
	fixed4 frag(v2f i): SV_Target
	{
		UNITY_SETUP_INSTANCE_ID(i);
		UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
		
		fixed4 col = 
			UNITY_SAMPLE_SCREENSPACE_TEXTURE(_PandaGrabOk, i.grabUv);
		return (1 - col);
	}
}

修正結果

  • Single Pass Instanced時の表示

  • Multi Pass時の表示も問題ない

備考

Single Pass InstancedのUnityマニュアルにあるポストプロセスシェーダーの場合と同じ話のよう
https://docs.unity3d.com/ja/2019.4/Manual/SinglePassInstancing.html

参考

https://forum.unity.com/threads/shader-shows-different-when-using-single-pass-instanced.1099975/

https://twitter.com/lil_xyzw/status/1469730854973116416

Discussion