4

ディファード シェーディング/ライティングを実装しようとしています。使用するバッファーの数/サイズを減らすために、深度テクスチャを使用して、後で世界の位置を再構築したいと考えました。

これを行うには、ピクセルの座標に射影行列の逆数とカメラ行列の逆数を掛けます。この種の作品ですが、位置が少しずれています。サンプリングされたワールド ポジション テクスチャとの絶対的な違いは次のとおりです。

ここに画像の説明を入力

参考までに、これは私が 2 番目のパス フラグメント シェーダーで使用するコードです。

vec2 screenPosition_texture = vec2((gl_FragCoord.x)/WIDTH, (gl_FragCoord.y)/HEIGHT);
float pixelDepth = texture2D(depth, screenPosition_texture).x;

vec4 worldPosition = pMatInverse*vec4(VertexIn.position, pixelDepth, 1.0);
worldPosition = vec4(worldPosition.xyz/worldPosition.w, 1.0);
//worldPosition /= 1.85;
worldPosition = cMatInverse*worldPosition_byDepth;

worldPosition /= 1.85 のコメントを外すと、(私のジオメトリ/深度値の範囲で) 位置がより良く再構築されます。出力を本来あるべきもの (3 番目のテクスチャに格納されている) と比較した後、いじってこの値を取得しました。

私は近くに 0.1、遠くに 100.0 を使用しており、ジオメトリは最大で約 15 離れています。精度の誤差があるかもしれないことはわかっていますが、これはカメラに近すぎる誤差が少し大きすぎるようです。ここで何か見逃しましたか?

4

1 に答える 1

2

コメントで述べたように、深度値を ndc 空間からクリップ空間に変換しませんでした。次の行を追加する必要がありました。

pixelDepth=pixelDepth*2.0-1.0;
于 2014-07-30T16:15:02.160 に答える