Я только что испытал, что копирование буфера глубины из буфера рендеринга в основной (предоставляемый контекстом) буфер глубины крайне ненадежен при использовании glBlitFramebuffer. Просто потому, что вы не можете гарантировать, что формат соответствует. Использование GL_DEPTH_COMPONENT24 в качестве внутреннего формата глубинной текстуры просто не работало на моем AMD Radeon 6950 (последний драйвер), потому что Windows (или драйвер) решил использовать эквивалент GL_DEPTH24_STENCIL8 в качестве формата глубины для моего переднего / заднего буфера, хотя я не запрашивал никакой точности трафарета (биты трафарета установлены в 0 в дескрипторе формата пикселя). При использовании GL_DEPTH24_STENCIL8 для глубинной текстуры моего кадрового буфера Blitting работал, как и ожидалось, но у меня были другие проблемы с этим форматом. Первая попытка отлично работала на картах NVIDIA, так что я уверен, что ничего не испортил.
Лучше всего (по моему опыту) копирование с помощью шейдера:
Фрагмент-программа (он же 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;
}
Код C ++ для копирования выглядит так:
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);
Я знаю, что ветка старая, но это был один из моих первых результатов, когда гуглил мою проблему, поэтому я хочу сохранить ее как можно более последовательной.