Acabo de experimentar que copiar un búfer de profundidad desde un buffer de representación al búfer de profundidad principal (proporcionado por el contexto) es muy poco confiable cuando se usa glBlitFramebuffer. Solo porque no puedes garantizar que el formato coincida. Usar GL_DEPTH_COMPONENT24 como mi formato interno de textura de profundidad simplemente no funcionaba en mi AMD Radeon 6950 (último controlador) porque Windows (o el controlador) decidieron usar el equivalente a GL_DEPTH24_STENCIL8 como el formato de profundidad para mi front/backbuffer, aunque No solicité ninguna precisión de plantilla (los bits de la galería de símbolos están configurados en 0 en el descriptor de formato de píxel). Al usar GL_DEPTH24_STENCIL8 para la textura de profundidad de mi framebuffer, el Blitting funcionó como se esperaba, pero tuve otros problemas con este formato. El primer intento funcionó bien en las tarjetas de NVIDIA, así que estoy bastante seguro de que no estropeé las cosas.
Lo que funciona mejor (en mi experiencia) se copia a través de shader:
El-Programa Fragmento (también conocido como 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;
}
El código C++ para copiar el aspecto siguiente:
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);
sé que el hilo es viejo, pero fue uno de mis primeros resultados cuando googeling mi problema, por lo que quiero mantenerlo lo más consistente posible.
yah, la función Blit funciona bien, gracias – ShPavel