Ich habe gerade erfahren, dass das Kopieren eines Tiefenpuffers von einem Renderpuffer in den main (kontextgespeicherten) Tiefenpuffer sehr unzuverlässig ist, wenn glBlitFramebuffer verwendet wird. Nur weil Sie nicht garantieren können, dass das Format passt. Die Verwendung von GL_DEPTH_COMPONENT24 als internes Tiefen-Textur-Format funktionierte bei meinem AMD Radeon 6950 (neuster Treiber) einfach nicht, da Windows (oder der Treiber) sich dafür entschied, das Äquivalent zu GL_DEPTH24_STENCIL8 als Tiefenformat für meinen Front-/Backbuffer zu verwenden Ich habe keine Schablonenpräzision angefordert (Schablonen-Bits wurden im Pixelformat-Deskriptor auf 0 gesetzt). Bei der Verwendung von GL_DEPTH24_STENCIL8 für die Tiefenstruktur meines Framebuffers funktionierte das Blitzen wie erwartet, aber ich hatte andere Probleme mit diesem Format. Der erste Versuch funktionierte gut auf NVIDIA-Karten, also bin ich mir ziemlich sicher, dass ich die Dinge nicht vermasselt habe.
Was am besten (nach meiner Erfahrung) arbeitet, ist das Kopieren über Shader:
Das Fragment-Programm (auch bekannt als Pixel-Shader) [GLSL]
#version 150
uniform sampler2D depthTexture;
in vec2 texCoords; //texture coordinates from vertex-shader
void main(void)
{
gl_FragDepth = texture(depthTexture, texCoords).r;
}
Der C++ Code für das Kopieren wie folgt aussieht:
glDepthMask(GL_TRUE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glEnable(GL_DEPTH_TEST); //has to be enabled for some reason
glBindFramebuffer(GL_FRAMEBUFFER, 0);
depthCopyShader->Enable();
DrawFullscreenQuad(depthTextureIndex);
ich weiß, dass der Thread ist alt, aber es war eine meiner ersten Ergebnisse, wenn mein Problem googeln, so möchte ich es behalten so konsistent wie möglich.
yah, Blit Funktion funktioniert gut, danke – ShPavel