2

私の遅延レンダラーでは、深度バッファーからフラグメントの位置を正常に再構築することができました....ほとんど。結果を追加のバッファーに保存されている位置と比較すると、画面から遠く離れた場所で多くのポップが発生していることに気付きました。これが私が見ているもののスクリーンショットです:

ここに画像の説明を入力

上部の緑と黄色の部分は単なるスカイボックスで、位置バッファには (0, 0, 0) が含まれていますが、再構築アルゴリズムはそれを深さ = 0.0 (または 1.0?) の通常のフラグメントとして解釈します。

シーンは を使用してレンダリングされるfragColor = vec4(0.5 + (reconstPos - bufferPos.xyz), 1.0);ため、結果のフラグメントが正確に (0.5, 0.5, 0.5) になる場所は、再構成とバッファーがまったく同じ値を持つ場所です。深度バッファーの奥の方が不正確であることが予想されますが、そのマゼンタとブルーは少し奇妙に思えます。

これは、深度バッファーから位置を再構築する方法です。

vec3 reconstructPositionWithMat(vec2 texCoord)
{
    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);
}

ここtexCoord = gl_FragCoord.xy / textureSize(colorBuffer, 0);で、 およびmatInvProjは、gbuffer のレンダリングに使用される射影行列の逆数です。

現在、私の位置バッファーはGL_RGBA32F(精度をテストするためだけのものであるため、帯域幅とメモリの浪費についてはあまり気にしません) であり、深度バッファーはGL_DEPTH24_STENCIL8(から同様の結果が得られましたGL_DEPTH_COMPONENT32。はい、ステンシル バッファーが必要です)。

私の znear は 0.01f で、zfar は 1000.0f です。2000.0fx 2000.0f の大きさの単一のクワッドを地面としてレンダリングしています (遠方の平面でクリップするのに十分な大きさにしたかったのです)。

このレベルの不正確さは許容できると考えられますか? 人々がこの問題を回避する方法にはどのようなものがありますか? ビュー/アイスペースの位置を再構築する方法に何か問題がありますか?

4

0 に答える 0