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

カメラのDepth Texture

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

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

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

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

DepthTextureMode.Depthテクスチャ

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

DepthTextureMode.DepthNormalsテクスチャ

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

UnityCG.cginc include file にはヘルパー関数DecodeDepthNormal があり,デプスおよび法線をエンコードされたピクセルの値よりデコードします。戻されるデプスは0から1の範囲です。

デプスや法線テクスチャの使用方法については,Shader Replacementのサンプルプロジェクトのエッジ検出イメージエフェクトあるいはSSAO Image Effect を参照して下さい。

ヒントおよびテクニック

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

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

内部の処理

デプステクスチャは,使用されるレンダリングパスおよびハードウェアによって,実際のデプスバッファから来るか,あるいは別のパスでレンダリングされます。デプステクスチャが別のパスにレンダリングされるとき,これはShader Replacement を通して行われます。したがってシェーダで正しい“RenderType” タグを使用することが重要です。

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