はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】ShaderGraphで不透明オブジェクトの描画結果を取得する(_CameraOpaqueTexture)

はじめに

今回はShagderGraphで不透明オブジェクトの描画結果を取得する記事になります!

ShaderGarphで背景に何かしらの操作を加えて描画したいときはないでしょうか。例えばこの画像みたいな感じ。

その根幹にある基礎的なところを今回はみていきたいと思います。

では早速みていきましょう。

環境

Unity2019.3.0f1
UniversalRP

その前に

Unityでは不透明のオブジェクトを描画->半透明のオブジェクトを描画という順番でレンダリングをします。

ねこますさんの記事がとても参考になりました↓↓
qiita.com

これを踏まえておくと、理解がより深まると思います。

準備

今回の目的のためには少しだけ準備する必要があります。といってもチェックを付けるだけですが。

まずはAssetsフォルダ内のどこかにUniversalRP-HighQualityというアセットがあるはずですので、探してみてください。(例:Assets->Settings->UniversalRP-HighQuality)

レンダリングパイプラインの設定の仕方によってはUniversalRP-LowQualityUniversalRP-MediumQualityかもしれませんが、設定をいじっていないなら基本はUniversalRP-HighQualityのはずです。

まあ心配ならば、全部に同じことをしてもOKです。


やるべきことは、Opaque Textureにチェックを付けることです。

f:id:hanaaaaaachiru:20191223180348p:plain

不透明オブジェクトの描画結果を取得する

不透明オブジェクトの描画結果は、プロパティのReferenceという項目にあらかじめ決められた「_CameraOpaqueTexture」という名前を設定することで取得できます。

またExposedというチェックを付けられる変数があるのですが、これがONだとインスペクターから設定することができるようになります。

ただし、今回は逆に表示はしてほしくないのに加えて、実際にONのままでやってみると動作がうまくいかなかったので忘れずにOFFにしておきましょう

f:id:hanaaaaaachiru:20191224142005p:plain

f:id:hanaaaaaachiru:20191224181008p:plain


この設定ができたら、以下のようなノードを組んでみてください。

f:id:hanaaaaaachiru:20191224185453p:plain

Screen Positionはメッシュの頂点またはフラグメントの画面位置を出力するするようです。
Screen Position Node | Shader Graph | 6.9.2

正直まだどういったものか雰囲気でしか掴めていないのですが、SampleTexture2DのUVにつなげることはよくありますので、覚えておいて損はないでしょう。


またPBR Masterの設定をTransparentに変更して透過ができるようにしておくことも忘れないで行いましょう。

f:id:hanaaaaaachiru:20191224190316p:plain


できたシェーダーを適当なマテリアルに適応し、ゲームオブジェクトに反映させるとこんな感じになるはずです。

f:id:hanaaaaaachiru:20191224192845p:plain

さいごに

これで不透明オブジェクトの描画結果を取得できました。

ちなみに今回はPBRを用いましたが、Unlitを使えば完全な透過(厳密にはタイトル通り違います)をすることができます。

取得できたものに対していろんな操作を加えれば、面白いものがたくさん作れるはずです。

是非試してみてください。