Version: 2020.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 を加えることでシャドウパスを生成することが可能です。

マテリアルとシェーダーが レンダーキュー <= 2500 に設定されている不透明オブジェクトは、深度テクスチャにレンダリングされます。

DepthTextureMode.DepthNormals テクスチャ

これは画面サイズ 32 ビット (8 ビット/チャネル) テクスチャを作ります。ビュー空間法線が R と G チャネルに、深度が B と A チャネルにエンコードされます。法線は、ステレオ投影を使用してエンコードされ、深度は 16 ビットの値で、2 つの 8 ビットチャネルにパックされます。

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

デプスと法線のテクスチャの使用例については、Shader Replacement のプロジェクト例の EdgeDetection イメージエフェクト、または スクリーンスペースのアンビエントオクルージョン のイメージエフェクト を参照してください。

DepthTextureMode.MotionVectors テクスチャ

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

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

ヒントおよびテクニック

カメラが深度や深度や深度+法線のテクスチャをレンダリングする際に、Camera Inspector に表示されます。

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

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

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

シェーダー変数

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

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

モーションベクトルテクスチャ (有効の場合) は、シェーダーでグローバルシェーダープロパティとして使用可能です。‘_CameraMotionVectorsTexture’ というサンプラーを宣言することによって、現在レンダリングしているカメラのテクスチャをサンプリングすることができます。

内部の処理

深度テクスチャは、使用されるレンダーパスやハードウェアに応じて、実際の深度バッファから直接取得されたり、別のパスにレンダリングされたりします。通常、ディファードシェーディングや古いディファードレンダーパスを使用する場合は、それらは G バッファのレンダリングによるものなので、深度テクスチャは “無料” で手に入ります。

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

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

参照

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