ディファード シェーディング/ライティングを実装しようとしています。使用するバッファーの数/サイズを減らすために、深度テクスチャを使用して、後で世界の位置を再構築したいと考えました。
これを行うには、ピクセルの座標に射影行列の逆数とカメラ行列の逆数を掛けます。この種の作品ですが、位置が少しずれています。サンプリングされたワールド ポジション テクスチャとの絶対的な違いは次のとおりです。
参考までに、これは私が 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 離れています。精度の誤差があるかもしれないことはわかっていますが、これはカメラに近すぎる誤差が少し大きすぎるようです。ここで何か見逃しましたか?