はじめに
今回はShaderGraphでZバッファをテクスチャとして取得してみる記事になります!
これができるとカメラから不透明オブジェクトまでの距離を取得できるので、こんなことができます。
これを応用すると霧などが作れたりと、かなり幅広いことができるようになるはずです。
早速みていきましょう。
環境
Unity2019.3.0f1
UniversalRP
その前に
そもそもZバッファってなんやねんということで少しみていきましょう。
Zバッファ(デプスバッファ,深度バッファ)とは不透明オブジェクトまでの深度(カメラからの距離)を格納したものを指しています。
なぜこんなものが取得できるのかというと、Unityがいつも裏側でしてくれる画面をレンダリングする際に用いられているからなんですね。
私自身もレンダリングについてはあまり詳しくないので、こちらの記事はとても参考になると思います。
準備
まずはAssetsフォルダ内のどこかにUniversalRP-HighQuality
というアセットがあるはずですので、探してみてください。(例:Assets->Settings->UniversalRP-HighQuality)
レンダリングパイプラインの設定の仕方によってはUniversalRP-LowQuality
やUniversalRP-MediumQuality
かもしれませんが、設定をいじっていないなら基本はUniversalRP-HighQuality
のはずです。
まあ心配ならば、全部に同じことをしてもOKです。
やるべきことは、Depth Textureにチェックを付けることです。
Zバッファのテクスチャを取得する
不透明オブジェクトの描画結果は、プロパティのReferenceという項目にあらかじめ決められた「_CameraDepthTexture」という名前を設定することで取得できます。
またExposedというチェックを付けられる変数があるのですが、これがONだとインスペクターから設定することができるようになります。
ただし、今回は逆に表示はしてほしくないのに加えて、実際にONのままでやってみると動作がうまくいかなかったので忘れずにOFFにしておきましょう。
この設定ができたら以下のようなノードを組んでみてください。
これで取得できるZバッファは奥の方が0で、手前に近くにつれて値が大きくなっています。ただ正規化(0~1)で表現されていないっぽい?ので、0~0.1
あたりに密集している感じでした。
ここらへんが詳しく分かる方がいましたら是非教えていただけると嬉しいです。
追記)UnlitノードのAlphaClipThreshold
は入力値以下のアルファ値を持つフラグメント(色)を破棄するということで、0にしておいた方がもっと綺麗にみえました。
またPBR Masterの設定をTransparentに変更して透過ができるようにしておくことも忘れないで行いましょう。
できたシェーダーを適当なマテリアルに適応し、ゲームオブジェクトに反映させるとこんな感じになるはずです。
さいごに
前回紹介した不透明オブジェクトの描画結果を取得する記事とかなり似ている内容になっていますね。
Zバッファを用いれば接触を検知したりなんかもできるみたいです。
こちらのUnityの公式の動画でも紹介されているので、みてみると面白いかもしれません。
www.youtube.com