Depth Texture の使用
プラットフォーム別のレンダリングの違い

カメラの深度テクスチャ

カメラ は、デプスあるいはデプス + 法線のテクスチャを生成することができます。これは最小限の G-buffer (グラフィックスバッファ)テクスチャで、ポストプロセッシングエフェクトあるいはカスタムのライティングモデル(例えばライト Pre-Pass )で使用することができます。カメラは実際に Shader Replacement 機能を使用してデプステクスチャをビルドするため、別のグラフィックスバッファ設定が必要である場合は自らこれを行うことができます。

Camera.depthTextureMode 変数を使って、カメラの Depth Texture をスクリプトから有効にすることができます。

二つの使用可能なデプステクスチャモードがあります。

  • DepthTextureMode.Depth: Depth Texture です。
  • DepthTextureMode.DepthNormals: デプスおよびビュー空間法線がひとつのテクスチャにパックされています。

DepthTextureMode.Depth テクスチャ

これは画面サイズの Depth Texture をビルドします。

デプステクスチャは、シャドウキャスターのレンダリングに使用するのと同じシェーダー内パスを使用してレンダリングされます(“ShadowCaster” pass type)。したがって拡張機能により、シェーダーがシャドウキャスティング(影付け)をサポートしていない場合(例えば、シェーダーかフォールバックのいずれにおいてもシャドウキャスターのパスがない)、そのシェーダーを使用するオブジェクトにデプステクスチャは表示されません。

  • シャドウキャスティング(影付け)パスを持つ別のシェーダーに フォールバック させるか、あるいは、
  • サーフェスシェーダー を使用している場合は、命令型 addshadow を追加することでシャドウパスが生成されるようにすることも可能です。

不透明(opaque)オブジェクト(マテリアルとシェーダーはレンダーキュー <= 2500)を使用するのに設定される)はデプステクスチャにレンダリングされることに注意してください。

DepthTextureMode.DepthNormals テクスチャ

これは画面サイズの 32 ビット( 8 ビット/チャネル)テクスチャを、ビュー空間法線が R および G チャネルにデプスが B および A チャネルに各々エンコードされる形で、ビルドします。法線は、Stereographic Projection (ステレオ投影)を使用してエンコードされ、デプスは二つの 8 ビットチャネルにパックされた 16 ビットの値です。

内蔵のシェーダー include ファイル にはヘルパー関数 DecodeDepthNormal があり、デプスおよび法線をエンコードされたピクセルの値よりデコードします。戻されるデプスは 0 から 1 の範囲です。

深さと法線テクスチャの使い方の例については、シェーダーの Replacement example project で EdgeDetection イメージ効果、または スクリーンスペースアンビエントオクルージョン(SSAO)を参照してください。

ヒントおよびテクニック

カメラは深さや深さ+法線テクスチャをレンダリングしているとき、カメラを示しています。

いくつかの効果を無効にした後、デプステクスチャがカメラ(Camera.depthTextureMode) から要求される方法は、それらを意味し、カメラはまだそれらのレンダリングを続ける場合があります。 特にカメラ(それぞれデプステクスチャを必要とします)に存在する複数の影響で、個々のエフェクトを無効にした場合、自動的にデプステクスチャのレンダリングを“disable”にするよい方法はありません。

複雑なシェーダーやイメージエフェクトを実装するとき、プラットフォーム別のレンダリングの違い を頭に入れてください。特に、イメージエフェクトでデプステクスチャを使用する場合は、Direct3D かつアンチエリアスで特別なハンドリングが必要です。

ケースによってはデプステクスチャはネイティブの Z バッファから直接来る場合があります。もしデプステクスチャで画像の乱れがある場合、それを使用するシェーダーが Z バッファに 書き込まないように してください。( ZWrite Off を使用してください)。

シェーダー変数

デプステクスチャは、グローバルシェーダープロパティーとしてシェーダーでサンプリングすることができます。_CameraDepthTexture というサンプラーを宣言することによって、カメラの主要デプステクスチャをサンプルすることができます。

_CameraDepthTexture は、常にカメラの最初のデプステクスチャを表します。 反対に _LastCameraDepthTexture は、カメラに最後にレンダーされたデプステクスチャを示します。例えば、スクリプトで解像度が半分のデプステクスチャを 2番目のカメラを使ってレンダーし、ポストプロセス シェーダーに利用する場合に役に立ちます。

内部の処理

デプステクスチャは、実際のデプスバッファから直接来ることができる か使用されるレンダリングパスやハードウェアに応じて異なるパスでレンダリングされます。 通常 Deferred Shading や とにかくG-buffer (グラフィックスバッファ)のレンダリングの商品なので、 デプステクスチャは「無料」で手に入ります。

DepthNormal テクスチャが別のパスにレンダリングされるとき、これは Shader Replacement を通して行われます。したがってシェーダーで正しい “RenderType” タグを使用することが重要です。

関連項目

Depth Texture の使用
プラットフォーム別のレンダリングの違い