Ho appena sperimentato che copiare un buffer di profondità da un buffer di rendering al buffer di profondità principale (contestualmente fornito) è altamente inaffidabile quando si usa glBlitFramebuffer. Solo perché non puoi garantire che il formato corrisponda. L'utilizzo di GL_DEPTH_COMPONENT24 come il mio formato di texture di profondità interno non funzionava sul mio AMD Radeon 6950 (ultimo driver) perché Windows (o il driver) ha deciso di usare l'equivalente a GL_DEPTH24_STENCIL8 come formato di profondità per il mio front/backbuffer, sebbene Non ho richiesto alcuna precisione di stencil (i bit di stencil impostati su 0 nel descrittore di formato pixel). Quando si utilizza GL_DEPTH24_STENCIL8 per la texture della profondità del mio framebuffer, il Blitting ha funzionato come previsto, ma ho avuto altri problemi con questo formato. Il primo tentativo ha funzionato bene con le schede NVIDIA, quindi sono abbastanza sicuro di non aver combinato problemi.
ciò che funziona meglio (nella mia esperienza) è la copia tramite Shader:
il frammento-Program (aka 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;
}
Il codice C++ per la copia simile a questa:
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);
so che il filo è vecchio, ma è stato uno dei miei primi risultati quando googeling il mio problema, quindi voglio tenerlo più coerente possibile.
yah, la funzione Blit funziona bene, grazie – ShPavel