私は OpenGL アプリで遅延シェーディングを実装していますが、位置情報を格納するために大量のメモリを浪費するのではなく、深度バッファーからの情報を使用してフラグメント シェーダーでビュー空間の位置を再構築したいと考えています。完全にはわかりませんが、正しい x/y があるように見えますが、z 情報が窓の外にあることはわかっています。位置の再構築を担当するフラグメント シェーダーの部分を次に示します。
vec3 reconstructPositionWithMat(void)
{
float depth = texture2D(depthBuffer, texCoord).x;
depth = (depth * 2.0) - 1.0;
vec2 ndc = (texCoord * 2.0) - 1.0;
vec4 pos = vec4(ndc, depth, 1.0);
pos = matInvProj * pos;
return vec3(pos.xyz / pos.w);
}
matInvProj
私の射影行列の逆です(CPUで計算され、均一なmat4としてアップロードされます)。位置情報 ( ) をレンダリングしようとするとfragColor = vec4(position, 1.0);
、画面の左下隅が黒、右下隅が赤、左上隅が緑、右上隅が黄色になります。これは、深度がシーン全体で一様に 0.0 である場合に期待するおおまかなものですが、明らかにそうあるべきではありません。
私は何を間違っていますか?