教育事業部の事業内容 演劇、音楽のタレント並びに作詞家、作曲家、編曲家等アーティストの育成及びマネージメント、コンピュータ教室の経営等を行っています。
教育事業 パルテア

〜Unity Graphics カメラと深度テクスチャ〜 #ゲームプログラミング #ゲーム制作 #unity3d #unity3dgames #unity2d

カメラは、深度、深度 + 法線、または動きベクトル テクスチャを生成できます。 これは、後処理エフェクトやカスタム照明モデル (ライトのプリパスなど) の実装に使用できる最小限の G バッファ テクスチャです。

これらは主にエフェクトによって使用されます。 たとえば、後処理エフェクトでは深度情報がよく使用されます。

深度テクスチャのピクセル値の範囲は 0 ~ 1 で、非線形分布になります。 精度は通常、使用する構成とプラットフォームに応じて 32 ビットまたは 16 ビットです。 デプス テクスチャから読み取る場合は、0 ~ 1 の範囲の高精度の値が返されます。 カメラからの距離、または線形の 0 ~ 1 の値を取得する必要がある場合は、ヘルパー マクロを使用して手動で計算します。

深度テクスチャは、ほとんどの最新のハードウェアおよびグラフィックス API でサポートされています。 特別な要件を以下に示します。

Direct3D 11 以降 (Windows)、OpenGL 3 以降 (Mac/Linux)、OpenGL ES 3.0 以降 (iOS)、Metal (iOS)、および一般的なコンソールは深度テクスチャをサポートしています。
OpenGL ES 2.0 (Android) では、GL_OES_ Depth_texture 拡張機能が存在する必要があります。WebGL では、WEBGL_ Depth_texture 拡張機能が必要です。

カメラの深度テクスチャ モードは、スクリプトの Camera. DepthTextureMode 変数を使用して有効にできます。 シェーダー置換機能を使用して、同様のテクスチャを自分で構築することもできます。

可能な深度テクスチャ モードは 3 つあります。

DepthTextureMode.Depth: 深度テクスチャ。

DepthTextureMode.DepthNormals: 深度およびビュー空間法線が 1 つのテクスチャにパックされます。

DepthTextureMode.MotionVectors: 現在のフレームの各画面テクセルのピクセルごとの画面空間モーション。 RG16 テクスチャに詰め込まれています。

これらはフラグなので、上記のテクスチャを任意に組み合わせて指定できます。

DepthTextureMode.深度テクスチャ

これにより、画面サイズの深度テクスチャが構築されます。

深度テクスチャは、シャドウ キャスターのレンダリングに使用されるものと同じシェーダー パス (ShadowCaster パス タイプ) を使用してレンダリングされます。 したがって、拡張すると、シェーダーがシャドウ キャストをサポートしていない場合 (つまり、シェーダーまたはフォールバックにシャドウ キャスター パスがない場合)、そのシェーダーを使用するオブジェクトは深度テクスチャに表示されません。

シェーダをシャドウ キャスティング パスを持つ他のシェーダにフォールバックさせます。または、サーフェス シェーダを使用している場合は、addshadow ディレクティブを追加すると、シャドウ パスも生成されます。
「不透明」オブジェクト (マテリアルとシェーダがレンダー キュー 2500 を使用するように設定されているもの) のみが深度テクスチャにレンダリングされることに注意してください。

深度テクスチャモード。 深度法線テクスチャ

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

UnityCG.cginc インクルード ファイルには、エンコードされたピクセル値から深度と法線をデコードするヘルパー関数 DecodeDepthNormal があります。 返される深さは 0..1 の範囲です。

深度および法線テクスチャの使用方法の例については、「実行時のシェーダの置換」または「後処理およびフルスクリーン エフェクトでのアンビエント オクルージョン」を参照してください。

深度テクスチャモード。 モーション ベクトル テクスチャ

これにより、画面サイズの RG16 (16 ビット浮動小数点/チャネル) テクスチャが構築され、画面空間のピクセル モーションが R&G チャネルにエンコードされます。 ピクセルの動きは画面の UV 空間でエンコードされます。

このテクスチャ モーションからサンプリングすると、エンコードされたピクセルから -1..1 の範囲で返されます。 これは、最後のフレームから現在のフレームまでの UV オフセットになります。

ヒントとコツ
カメラ インスペクターは、カメラが深度または深度 + 法線テクスチャをレンダリングしていることを示します。

深度テクスチャがカメラから要求される方法 (Camera. DepthTextureMode) は、深度テクスチャを必要とするエフェクトを無効にした後も、カメラが引き続きテクスチャのレンダリングを継続する可能性があることを意味する場合があります。 カメラに複数のエフェクトが存在し、それぞれに深度テクスチャが必要な場合、個々のエフェクトを無効にすると深度テクスチャのレンダリングを自動的に無効にする良い方法はありません。

複雑なシェーダーやイメージ エフェクトを実装する場合は、プラットフォーム間のレンダリングの違いに留意してください。 特に、イメージ エフェクトで深度テクスチャを使用すると、Direct3D + アンチエイリアシングで特別な処理が必要になることがよくあります。

場合によっては、深度テクスチャがネイティブ Z バッファから直接取得される場合があります。 深度テクスチャにアーティファクトが見られる場合は、それを使用するシェーダが Z バッファに書き込まないようにしてください (ZWrite Off を使用してください)。

シェーダ変数

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

_CameraDepthTexture は常にカメラのプライマリ深度テクスチャを参照します。 対照的に、_LastCameraDepthTexture を使用すると、任意のカメラによってレンダリングされた最後の深度テクスチャを参照できます。 これは、たとえば、セカンダリ カメラを使用してスクリプトで半分の解像度の深度テクスチャをレンダリングし、それをポストプロセス シェーダで利用できるようにしたい場合に便利です。

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

フードの下

深度テクスチャは、使用されるレンダリング パスとハードウェアに応じて、実際の深度バッファから直接取得することも、別のパスでレンダリングすることもできます。 通常、Deferred Shading または Legacy Deferred Lighting レンダリング パスを使用する場合、深度テクスチャは G バッファ レンダリングの産物であるため、「無料」で提供されます。

DepthNormals テクスチャが別のパスでレンダリングされる場合、これはシェーダー置換によって行われます。 したがって、シェーダーに正しい「RenderType」タグを含めることが重要です。

有効にすると、MotionVectors テクスチャは常に追加のレンダー パスから取得されます。 Unity は、移動するゲームオブジェクトをこのバッファーにレンダリングし、最後のフレームから現在のフレームまでのモーションを構築します。

    unity

  • 日時:// ~ //
  • 名称:
  • 場所:
  • 料金:¥0 (消費税込)