カメラ は、深度、深度 + 法線、またはモーションベクトルのテクスチャを生成できます。これは最低の G バッファテクスチャで、ポストプロセスエフェクトに使用されたり、カスタムライティングモデル (ライトプリパスなど) の実装に使用されます。
これらは主にエフェクトで使用されます。例えば、ポストプロセスエフェクト では、深度情報がよく使用されます。
深度テクスチャのピクセル値はリニアでない分布で、0 から 1 までの範囲です。使用される設定とプラットフォームによって、一般に精度は 32 ビットか 16 ビットです。深度テクスチャから読み込みするときは、0 から 1 の範囲の高精度の値が返されます。もしカメラからの距離、あるいは、リニアの 0 から 1 までの値を取得する必要がある場合、ヘルパーのマクロを使って、それを手動で計算する必要があります (以下を参照)。
深度テクスチャは、現段階で一般的に使用されている多くのハードウェアとグラフィックス API でサポートされています。以下は特別な仕様のリストです。
カメラの深度テクスチャモードは、Camera.depthTextureMode 変数を使って、スクリプトから有効にすることができます。また、シェーダーの置き換え 機能を使って、同様のテクスチャを自身で作ることも可能です。
3 つの使用可能な深度テクスチャモードがあります。
これらのフラグを使って、上記のテクスチャのどのような組み合わせも指定することができます。
これは、画面サイズの深度テクスチャを作ります。
深度テクスチャは、シャドウキャスターのレンダリングに使用されるのと同じシェーダーパスを使用してレンダリングされます (ShadowCaster
パスタイプ)。そのため、拡張機能により、シェーダーがシャドウキャスティング (影付け) をサポートしていない場合 (つまり、シェーダーかどのフォールバックにもシャドウキャスターのパスがない場合)、そのシェーダーを使用するオブジェクトは深度テクスチャに表示されません。
addshadow
を加えることでシャドウパスを生成することが可能です。マテリアルとシェーダーが レンダーキュー <= 2500 に設定されている不透明オブジェクトは、深度テクスチャにレンダリングされます。
これは画面サイズ 32 ビット (8 ビット/チャネル) テクスチャを作ります。ビュー空間法線が R と G チャネルに、深度が B と A チャネルにエンコードされます。法線は、ステレオ投影を使用してエンコードされ、深度は 16 ビットの値で、2 つの 8 ビットチャネルにパックされます。
UnityCG.cginc
include ファイル にはヘルパー関数 DecodeDepthNormal
があり、エンコードしたピクセルの値から深度と法線をデコードします。0 から 1 の範囲で深度を返します。
深度と法線のテクスチャの使用例については、ランタイムのシェーダーの置き換え または スクリーンスペースアンビエントオクルージョンの画像効果 を参照してください。
これは、画面サイズ 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 はこのバッファに動いているオブジェクトをレンダリングし、その動きを以前のフレームから現在のフレームに描画します。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.