LoginSignup
4
1

More than 1 year has passed since last update.

[Unity]Blitで渡したカメラに映る画面テクスチャがシェーダーで空になる問題

Posted at

先に結論

CameraTarget(画面)はテクスチャじゃ無いため、_MainTexとして渡せないことが原因でした。
sourceとdestのみのBlit呼び出しで一時的なレンダテクスチャに画面の表示を渡し、その後にシェーダーをかけることで解決できました。

経緯

GameRender.cs
commandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, dest, material);

みたいなコードで画面にポストエフェクトをかけるシェーダーを書いていたのですが、シェーダー側の_MainTexCameraTargetが持ってるはずのテクスチャが渡されませんでした。

ドキュメントを読んでも

ソーステクスチャやレンダーターゲットは "_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);

このようにコードを修正することで解決しました。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1