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

カメラの深度テクスチャ

カメラ は、デプス、デプス + 法線、モーションベクターのテクスチャを生成することができます。これは最小限の G-buffer (グラフィックスバッファ)テクスチャで、ポストプロセッシングエフェクトあるいはカスタムのライティングモデル(例えばライト Pre-Pass )で使用することができます。シェーダーの変更 機能を使用して、自身で類似したテクスチャをビルドすることも可能です。

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

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

  • DepthTextureMode.Depth: デプステクスチャ
  • DepthTextureMode.DepthNormals: デプスとビュー空間の法線を1まとめにしたテクスチャ*
  • DepthTextureMode.MotionVectors: 現在のフレームの各スクリーンテクセルのピクセルスクリーン空間の動き。RG16 テクスチャにまとめられます。

これらのフラグを使って、上記のテクスチャのどのような組み合わせも指定することができます。

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)を参照してください。

DepthTextureMode.MotionVectors テクスチャ

これは、画面サイズ RG16 (16bit float/channel) のテククチャをビルドします。スクリーン空間のピクセルモーションは R&G channel にエンコードされます。ピクセルモーションはスクリーンの UV 空間でエンコードされます。

エンコードしたピクセルからテクスチャモーションをサンプリングすると、その範囲は –1 から 1 になります。これは以前のフレームから現在のフレームの UV の差を表します。

ヒントおよびテクニック

カメラのデプスや深さや深さ+法線テクスチャのレンダリングは、Camera インスペクターに表示されます。

デプステクスチャを必要とするエフェクトを無効にした後に Camera がまだそれをレンダリングしていると、Camera (Camera.depthTextureMode)からデプステクスチャが要求される場合があります。それぞれがデプステクスチャを必要とする複数のエフェクトが Camera に存在するときに、自動的にデプステクスチャのレンダリングを無効にするよい方法はありません。

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

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

シェーダー変数

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

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

モーションベクターテクスチャはグローバルなシェーダープロパティーなので、シェーダーで使用できます。 ‘_CameraMotionVectorsTexture’ というサンプラーを宣言することによって、現在レンダリング中のカメラのテクスチャをサンプリングできます。

内部の処理

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

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

使用可能な場合は、モーションベクターのテクスチャは常に余分なレンダーパスから与えられます。Unity はこのバッファに動いているオブジェクトをレンダリングし、その動きを以前のフレームから現在のフレームに描画します。

参照

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