カスタム マテリアルエディタ
カメラのDepth Texture

Depth Textureの使用

各ピクセルが高い精度の“Depth” 値を持つRender Textures を作成することが出来ます(RenderTextureFormat.Depth )。主に使用されるのはエフェクトでシーンのデプスが使用可能であることが必要な場合です(例えば,ソフト パーティクル,スクリーン空間環境光オクルージョン(Screen Space Ambient Occlusion),透過はすべてシーンのデプスが必要です)。

デプステクスチャのピクセル値は,線形でない分布を示し,0から1までの範囲です。使用されているデプスバッファにもとづいて,一般に精度は24ビットか16ビットです。デプステクスチャから読み込みするときは,0から1の範囲の高精度の値が戻されます。もしカメラからの距離を取得する必要がある,あるいは別の形で線形の値を取得する必要がある場合,それを手動で計算する必要があります。

Unityのデプステクスチャは異なるプラットフォームでは異なって実装されています。

  • Direct3D 9 (Windows)では,デプステクスチャはは負のデプスバッファか,ひとつのチャネルの32ビット浮動小数点数テクスチャ (“R32F” Direct3D形式J)です。
    • Graphics card must support either native depth buffer (INTZ format) or floating point render textures in order for them to work.
    • When rendering into the depth texture, fragment program must output the value needed.
    • When reading from depth texture, red component of the color contains the high precision value.
  • OpenGL (Mac OS X)では,デプステクスチャはネイティブのOpenGLデプスバッファです。ARB_depth_texture を参照下さい)。
  • OpenGL (Mac OS X)では,デプステクスチャはネイティブのOpenGLデプスバッファです。ARB_depth_texture を参照下さい)。
    • Depth texture corresponds to Z buffer contents that are rendered, it does not use the result from the fragment program.
  • OpenGL ES 2.0 (iOS/Android) は上記のOpenGLと非常に似ています。
  • Direct3D 11 (Windows) はOpenGLのように,ネイティブ デプステクスチャに対応しています。
  • Flash (Stage3D) はカラーにエンコードされたデプステクスチャを使用して,必要とされている高精度をエミュレートします。

デプステクスチャ ヘルプマクロの使用

ほとんどの場合デプステクスチャはカメラからのデプスをレンダリングするのに使用されます。UnityCG.cginc include file には上記のケースの複雑さに対応するためのマクロを含んでいます。

  • UNITY_TRANSFER_DEPTH(o): これは頂点のEye Space Depth(視点空間デプス)を計算し,o (float2であることが必須)に出力します。デプステクスチャに対してレンダリングするときに頂点プログラムで使用して下さい。ネイティブ デプステクスチャのあるプラットフォームでは,Zバッファの値は暗黙的にレンダリングされるため,このマクロは何もしません。
  • UNITY_OUTPUT_DEPTH(i): これは頂点のEye Space Depthをi (float2であることが必須)から戻します。デプステクスチャに対してレンダリングするときに,フラグメントプログラムで使用して下さい。ネイティブ デプステクスチャのあるプラットフォームではこのマクロは,Zバッファ値が暗黙的にレンダリングされるため,常にゼロを戻します。
  • COMPUTE_EYEDEPTH(o): これは頂点のEye Space Depthを計算し,oに出力します。頂点プログラムで,デプステクスチャに__レンダリングしない__ ときに,使用します。
  • DECODE_EYEDEPTH(i): デプステクスチャi から高精度の値を受け取り,該当するEye Space Depthを戻します。このマクロはDirect3Dでは単にi*FarPlane を戻します。ネイティブ デプステクスチャのあるプラットフォームではこのマクロは,,カメラの範囲に一致するように,値を線形化し拡張します。

例えば,このシェーダはオブジェクトのデプスをレンダリングします:

Shader "Render Depth" {
SubShader {
    Tags { "RenderType"="Opaque" }
    Pass {
        Fog { Mode Off }
CGPROGRAM

#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

struct v2f {
    float4 pos : SV_POSITION;
    float2 depth : TEXCOORD0;
};

v2f vert (appdata_base v) {
    v2f o;
    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
    UNITY_TRANSFER_DEPTH(o.depth);
    return o;
}

half4 frag(v2f i) : COLOR {
    UNITY_OUTPUT_DEPTH(i.depth);
}
ENDCG
    }
}
}
カスタム マテリアルエディタ
カメラのDepth Texture