Version: 2021.1
物理カメラの使用
カメラのテクニック

Cameras and depth textures

A Camera can generate a depth, depth+normals, or motion vector texture. This is a minimalistic g-buffer texture that can be used for post-processing effects or to implement custom lighting models (e.g. light pre-pass).

These are mostly used by effects; for example, post-processing effects often use depth information.

Pixel values in the depth texture range between 0 and 1, with a non-linear distribution. Precision is usually 32 or 16 bits, depending on configuration and platform used. When reading from the Depth Texture, a high precision value in a range between 0 and 1 is returned. If you need to get distance from the Camera, or an otherwise linear 0–1 value, compute that manually using helper macros (see below).

デプステクスチャは、現段階で一般的に使用されている多くのハードウェアとグラフィックス API でサポートされています。以下は特別な必要事項のリストです。

  • Direct3D 11+ (Windows), OpenGL 3+ (Mac/Linux), OpenGL ES 3.0+ (iOS), Metal (iOS) and consoles like PS4/Xbox One all support depth textures.
  • OpenGL ES 2.0 (Android) requires GL_OES_depth_texture extension to be present.
  • WebGL は WEBGL_depth_texture拡張が必要です。

The Camera’s depth Texture mode can be enabled using Camera.depthTextureMode variable from script. It is also possible to build similar textures yourself, using Shader Replacement feature.

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

  • DepthTextureMode.Depth: a depth texture.
  • DepthTextureMode.DepthNormals: デプスとビュー空間の法線を1まとめにしたテクスチャ*
  • DepthTextureMode.MotionVectors: 現在のフレームの各スクリーンテクセルのピクセルスクリーン空間の動き。RG16 テクスチャにまとめられます。

これらのフラグを使って、上記のテクスチャのどのような組み合わせも指定することができます。

DepthTextureMode.Depth テクスチャ

This builds a screen-sized depth texture.

デプステクスチャは、シャドウキャスターのレンダリングに使用するのと同じシェーダー内パスを使用してレンダリングされます(“ShadowCaster” pass type)。したがって拡張機能により、シェーダーがシャドウキャスティング(影付け)をサポートしていない場合(例えば、シェーダーかフォールバックのいずれにおいてもシャドウキャスターのパスがない)、そのシェーダーを使用するオブジェクトにデプステクスチャは表示されません。

  • シャドウキャスティング(影付け)パスを持つ別のシェーダーに フォールバック させるか、あるいは、
  • サーフェスシェーダー を使用している場合は、命令型 addshadow を追加することでシャドウパスが生成されるようにすることも可能です。

不透明(opaque)オブジェクト(マテリアルとシェーダーはレンダーキュー <= 2500)を使用するのに設定される)はデプステクスチャにレンダリングされることに注意してください。

DepthTextureMode.DepthNormals テクスチャ

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

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

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

DepthTextureMode.MotionVectors テクスチャ

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

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

ヒントおよびテクニック

カメラのデプスや深さや深さ+法線テクスチャのレンダリングは、Camera インスペクターに表示されます。

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

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

In some cases, the depth texture might come directly from the native Z buffer. If you see artifacts in your depth texture, make sure that the shaders that use it do not write into the Z buffer (use ZWrite Off).

シェーダー変数

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

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

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

内部の処理

デプステクスチャは、実際のデプスバッファから直接来ることができる か使用されるレンダリングパスやハードウェアに応じて異なるパスでレンダリングされます。 通常 Deferred Shading や とにかくG-buffer (グラフィックスバッファ)のレンダリングの商品なので、 デプステクスチャは「無料」で手に入ります。

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

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

物理カメラの使用
カメラのテクニック