はじめに
今回はShagderGraphで不透明オブジェクトの描画結果を取得する記事になります!
ShaderGarphで背景に何かしらの操作を加えて描画したいときはないでしょうか。例えばこの画像みたいな感じ。
ShaderGraphのゲームボーイ風の奴を進化させてみましたー#unity pic.twitter.com/VuSbbMhDi8
— はなちる@ゲーム制作 (@hanaaaaaachiru) December 9, 2019
その根幹にある基礎的なところを今回はみていきたいと思います。
では早速みていきましょう。
環境
Unity2019.3.0f1
UniversalRP
その前に
Unityでは不透明のオブジェクトを描画->半透明のオブジェクトを描画という順番でレンダリングをします。
ねこますさんの記事がとても参考になりました↓↓
qiita.com
これを踏まえておくと、理解がより深まると思います。
準備
今回の目的のためには少しだけ準備する必要があります。といってもチェックを付けるだけですが。
まずはAssets
フォルダ内のどこかにUniversalRP-HighQuality
というアセットがあるはずですので、探してみてください。(例:Assets->Settings->UniversalRP-HighQuality)
レンダリングパイプラインの設定の仕方によってはUniversalRP-LowQuality
やUniversalRP-MediumQuality
かもしれませんが、設定をいじっていないなら基本はUniversalRP-HighQuality
のはずです。
まあ心配ならば、全部に同じことをしてもOKです。
やるべきことは、Opaque Texture
にチェックを付けることです。
不透明オブジェクトの描画結果を取得する
不透明オブジェクトの描画結果は、プロパティのReferenceという項目にあらかじめ決められた「_CameraOpaqueTexture」という名前を設定することで取得できます。
またExposed
というチェックを付けられる変数があるのですが、これがONだとインスペクターから設定することができるようになります。
ただし、今回は逆に表示はしてほしくないのに加えて、実際にONのままでやってみると動作がうまくいかなかったので忘れずにOFFにしておきましょう。
この設定ができたら、以下のようなノードを組んでみてください。
Screen Position
はメッシュの頂点またはフラグメントの画面位置を出力するするようです。
Screen Position Node | Shader Graph | 6.9.2
正直まだどういったものか雰囲気でしか掴めていないのですが、SampleTexture2D
のUVにつなげることはよくありますので、覚えておいて損はないでしょう。
またPBR Master
の設定をTransparent
に変更して透過ができるようにしておくことも忘れないで行いましょう。
できたシェーダーを適当なマテリアルに適応し、ゲームオブジェクトに反映させるとこんな感じになるはずです。
さいごに
これで不透明オブジェクトの描画結果を取得できました。
ちなみに今回はPBR
を用いましたが、Unlit
を使えば完全な透過(厳密にはタイトル通り違います)をすることができます。
取得できたものに対していろんな操作を加えれば、面白いものがたくさん作れるはずです。
是非試してみてください。