2

私は 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 である場合に期待するおおまかなものですが、明らかにそうあるべきではありません。

私は何を間違っていますか?

4

1 に答える 1

0

私は問題を発見しました。単にデータを間違って解釈していたのです。( ) としてレンダリングすることで、fragColor = vec4(position.xy, -(position.z + 1.0), 1.0)期待どおりの結果が得られました。さらに、それをバッファの位置 ( 0.5 + (reconstructedPos - bufferPos)) と比較すると、深さの精度が問題となる遠く離れた領域を除いて、シーンはほとんど灰色で終了しました。これは正しい再構成結果から予想したことです。

于 2014-03-10T01:10:29.090 に答える