はなちるのマイノート

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

【Unity】ShaderGraphでZバッファ(深度バッファ)をテクスチャとして取得する(_CameraDepthTexture)

はじめに

今回はShaderGraphでZバッファをテクスチャとして取得してみる記事になります!

これができるとカメラから不透明オブジェクトまでの距離を取得できるので、こんなことができます。

f:id:hanaaaaaachiru:20191225191958g:plain

これを応用すると霧などが作れたりと、かなり幅広いことができるようになるはずです。

早速みていきましょう。

環境

Unity2019.3.0f1
UniversalRP

その前に

そもそもZバッファってなんやねんということで少しみていきましょう。

Zバッファ(デプスバッファ,深度バッファ)とは不透明オブジェクトまでの深度(カメラからの距離)を格納したものを指しています。

なぜこんなものが取得できるのかというと、Unityがいつも裏側でしてくれる画面をレンダリングする際に用いられているからなんですね。

私自身もレンダリングについてはあまり詳しくないので、こちらの記事はとても参考になると思います。

qiita.com

準備

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

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

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


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

f:id:hanaaaaaachiru:20191225002722p:plain

Zバッファのテクスチャを取得する

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

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

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

f:id:hanaaaaaachiru:20191225190146p:plain

f:id:hanaaaaaachiru:20191225190550p:plain


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

f:id:hanaaaaaachiru:20191225191309p:plain

これで取得できるZバッファは奥の方が0で、手前に近くにつれて値が大きくなっています。ただ正規化(0~1)で表現されていないっぽい?ので、0~0.1あたりに密集している感じでした。

ここらへんが詳しく分かる方がいましたら是非教えていただけると嬉しいです。
追記)UnlitノードのAlphaClipThreshold入力値以下のアルファ値を持つフラグメント(色)を破棄するということで、0にしておいた方がもっと綺麗にみえました。


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

f:id:hanaaaaaachiru:20191225192140p:plain

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

f:id:hanaaaaaachiru:20191225191958g:plain

さいごに

前回紹介した不透明オブジェクトの描画結果を取得する記事とかなり似ている内容になっていますね。

Zバッファを用いれば接触を検知したりなんかもできるみたいです。

こちらのUnityの公式の動画でも紹介されているので、みてみると面白いかもしれません。
www.youtube.com