先に結論
CameraTarget(画面)はテクスチャじゃ無いため、_MainTex
として渡せないことが原因でした。
sourceとdestのみのBlit呼び出し
で一時的なレンダテクスチャに画面の表示を渡し、その後にシェーダーをかけることで解決できました。
経緯
GameRender.cs
commandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, dest, material);
みたいなコードで画面にポストエフェクトをかけるシェーダーを書いていたのですが、シェーダー側の_MainTex
にCameraTarget
が持ってるはずのテクスチャが渡されませんでした。
ドキュメントを読んでも
ソーステクスチャやレンダーターゲットは "_MainTex" プロパティーとしてマテリアルに渡されます
としか書いておらず、原因が分からず…
いろいろ調べても情報が無く、ヤケクソでTwitterで検索かけたら下記のツイートがヒットしました。
画面はテクスチャじゃ無いかららしい
という言葉のソースになるドキュメントは見つかりませんでしたが、起きてる状態に完全に合致したので、一時的なレンダテクスチャを用意してBlitを2段階に分けたところ、見事解決できました。ツイートに感謝…!
GameRender.cs
static int TempID = Shader.PropertyToID("_Temp");
// 中略
// 一時的なレンダテクスチャを作成
commandBuffer.GetTemporaryRT(TempID, -1, -1, 0, FilterMode.Bilinear);
// CameraTargetを一時的なレンダテクスチャに移して、それに対してシェーダーをかける
commandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, TempID);
commandBuffer.Blit(TempID, dest, material);
// 一時的なレンダテクスチャを解放
commandBuffer.ReleaseTemporaryRT(TempID);
このようにコードを修正することで解決しました。