3

対数深度バッファを線形化するには?

フラグメント シェーダーでの線形深度バッファーの視覚化

  float n = 1.0; // camera z near
  float f = 27000000.0; // camera z far
  float z = texture( DepthTex, TexCoord ).x;
  float d = (2.0 * n) / (f + n - z * (f - n));
  FragColor=vec4(d,d,d,1);

球頂点シェーダー

vec4 ClipCoords(vec3 position,mat4 matrix)
{
   vec4 clip = matrix * vec4(position,1.0f);
   clip.z =((2.0f * log(1.0f * clip.z + 1.0f) / log(1.0f * 27000000.0f + 1.0f)) - 1.0f) * clip.w;
   return clip;
}
 gl_Position = ClipCoords(position,matrix);

左の部分は、対数深度バッファーの線形化またはその欠如を示していますが、右の部分はloggl_Position = matrix * vec4(position,1.0f); ここに画像の説明を入力

4

1 に答える 1

6

対数深度バッファを使用すると、最終的に深度バッファ (0..1) に格納される値へのシーン (カメラ空間) 深度のマッピングは次のようになります。

depth_value = log(C*z + 1) / log(C*Far + 1)

ここで、z はシーンへの正の深度です。それ以外の場合は、投影後のクリップ スペースの w コンポーネントから取得できます (コードでは ..log(clip.w + 1.0).. を使用できます)。

フラグメント シェーダーでカメラ空間の深度を取得するには、式を逆にする必要があります。

z = (exp(depth_value*log(C*far+1)) - 1)/C

または同等に

z = (pow(C*far+1,depth_value)-1)/C

0..far から 0..1 への線形マッピングを取得するには、それを far 値で除算します。

于 2013-08-12T12:37:46.203 に答える