OpenGL, как использовать глубинный буфер из кадрового буфера как обычный буфер глубины - PullRequest
9 голосов
/ 28 марта 2012

У меня есть кадровый буфер с компонентом глубины и 4 цветными вложениями с 4 текстурами

Я рисую кое-что в нем и после этого распаковываю буфер, используя 4 текстуры для фрагментного шейдера (отложенное освещение). Позже я хочу нарисовать еще кое-что на экране, используя буфер глубины из моего кадрового буфера, это возможно?

Я попытался снова связать фрейм-буфер и указать glDrawBuffer (GL_FRONT), но он не работает.

Ответы [ 3 ]

10 голосов
/ 28 марта 2012

Как уже сказал Николь, вы не можете напрямую использовать буфер глубины FBO в качестве буфера глубины кадрового буфера по умолчанию.

Но вы можете скопировать буфер глубины FBO в буфер кадров по умолчанию, используя EXT_framebuffer_blit расширение (которое должно быть ядром после GL 3):

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, 
                  GL_DEPTH_BUFFER_BIT, GL_NEAREST);

Если это расширение не поддерживается (что я сомневаюсь, когда у вас уже есть FBO), вы можете использовать текстуру глубины для прикрепления глубины FBO ивизуализируйте его в кадровый буфер по умолчанию, используя текстурированный квад и простой проходной фрагментный шейдер, который записывает в gl_FragDepth.Хотя это может быть медленнее, чем просто смахнуть.

9 голосов
/ 24 июня 2013

Я только что испытал, что копирование буфера глубины из буфера рендеринга в основной (предоставляемый контекстом) буфер глубины крайне ненадежен при использовании 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);

Я знаю, что ветка старая, но это был один из моих первых результатов, когда гуглил мою проблему, поэтому я хочу сохранить ее как можно более последовательной.

2 голосов
/ 28 марта 2012

Вы не можете прикрепить изображения (цвет или глубину) к кадровому буферу по умолчанию.Точно так же вы не можете взять изображения из стандартного кадрового буфера и прикрепить их к FBO.

...