本日はUnityShader学習枠です。
先日、一昨日とUnityのshader表現で_CameraOpaqueTextureを使用していきました。
これはシーン内のカメラ映像をShader内で画像として使用できるURPの機能です。
クラシックなビルドインパイプラインの場合はGrabPass{}がこれに該当します。
この機能を使用している中、最初ドロステ効果できれいに描画されないという沼にはまっていたので記事にします。
〇ドロステ効果とは?
ドロステ効果は、筆者はこの現象を調べる中で初めて名前を知りましたが日常でもよく見られる現象です。
カメラの映像をモニターに接続し、その映像をカメラでとらえることでカメラの映像を映す画面にはまるで合わせ鏡のように無限にモニターが出力されます。
この現象を専門的にはドロステ効果と呼ぶようです。
HoloLensでもミラーリングしている際にミラーリングを映している画面を見ることで発生します。
Unityのshaderの場合_CameraOpaqueTextureでカメラの映像を取得してShader内で使用した際に、このShaderを適応したマテリアルを見ることでドロステ効果が発生してしまいました。
筆者が想定していた処理は先日紹介したようにカラーフィルターのようにカメラから見てオブジェクトの後ろの風景をそのまま取得したかったです。(いわば光学迷彩)
これが発生する原因としては単純で、_CameraOpaqueTextureで取得・描画する映像に自分自身が入ってしまっているためです。
今回は_CameraOpaqueTextureの性質を使用してこの問題を回避します。
〇_CameraOpaqueTexture
_CameraOpaqueTextureはすでに何度も紹介しているようにShader側でカメラのレンダリング結果をテクスチャとして使用できる機能です。
この際に_CameraOpaqueTextureは不透明(Opaque)のレンダリング結果のみを取得します。
つまり、昨日作成したカラーフィルターの例で説明すると、フィルターの背部にあるTransparent(半透明)なオブジェクトは描画されません。
これを利用して_CameraOpawueTextureを使用するmaterial自体をTransparentにすることで自分自身を_CameraOpaqueTextureに含めないことができます。
これはRender Queueを3000に設定します。
これによってシェーダーを適応したオブジェクトがTransparentになり、_CameraOpaqueTextureに書き込まれることがなくなりました。
以上でドロステ効果を回避して_CameraOpawueTextureを使用することができました。