カメラ は、デプス、デプス + 法線、モーションベクターのテクスチャを生成することができます。これは最小限の G-buffer (グラフィックスバッファ)テクスチャで、ポストプロセッシングエフェクトあるいはカスタムのライティングモデル(例えばライト Pre-Pass )で使用することができます。シェーダーの変更 機能を使用して、自身で類似したテクスチャをビルドすることも可能です。
Camera.depthTextureMode 変数を使って、カメラの Depth Texture をスクリプトから有効にすることができます。
3つの使用可能なデプステクスチャモードがあります。
これらのフラグを使って、上記のテクスチャのどのような組み合わせも指定することができます。
これは画面サイズの Depth Texture をビルドします。
デプステクスチャは、シャドウキャスターのレンダリングに使用するのと同じシェーダー内パスを使用してレンダリングされます(“ShadowCaster” pass type)。したがって拡張機能により、シェーダーがシャドウキャスティング(影付け)をサポートしていない場合(例えば、シェーダーかフォールバックのいずれにおいてもシャドウキャスターのパスがない)、そのシェーダーを使用するオブジェクトにデプステクスチャは表示されません。
addshadow
を追加することでシャドウパスが生成されるようにすることも可能です。不透明(opaque)オブジェクト(マテリアルとシェーダーはレンダーキュー <= 2500)を使用するのに設定される)はデプステクスチャにレンダリングされることに注意してください。
これは画面サイズの 32 ビット( 8 ビット/チャネル)テクスチャを、ビュー空間法線が R および G チャネルにデプスが B および A チャネルに各々エンコードされる形で、ビルドします。法線は、Stereographic Projection (ステレオ投影)を使用してエンコードされ、デプスは二つの 8 ビットチャネルにパックされた 16 ビットの値です。
内蔵のシェーダー include ファイル にはヘルパー関数 DecodeDepthNormal
があり、デプスおよび法線をエンコードされたピクセルの値よりデコードします。戻されるデプスは 0 から 1 の範囲です。
深さと法線テクスチャの使い方の例については、シェーダーの Replacement example project で EdgeDetection イメージ効果、または スクリーンスペースアンビエントオクルージョン(SSAO)を参照してください。
これは、画面サイズ 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 はこのバッファに動いているオブジェクトをレンダリングし、その動きを以前のフレームから現在のフレームに描画します。