Отложенный рендеринг: использовать буфер глубины из Gbuffer в кадровом буфере по умолчанию

Я делаю приложение отложенного рендеринга с C ++ и OpenGL. После выполнения геометрии и проходов света я хочу визуализировать некоторые частицы. Но я нуждаюсь в некотором глубоком тестировании на тех. Итак, я хочу использовать буфер глубины, связанный с моим GBuffer, чтобы провести некоторое тестирование глубины при рисовании в стандартный кадровый буфер OpenGL.

Я делаю и привязываю буфер глубины / текстуру к кадровому буферу / GBuffer следующим образом

glGenTextures(1, &_depthTextureID);
glBindTexture(GL_TEXTURE_2D, _depthTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, _width, _height, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, _depthTextureID, 0);

Как связать буфер глубины Gbuffer с кадровым буфером по умолчанию для проверки глубины на проходе геометрии?

0

Решение

Вы не можете связать созданные буферы рендеринга или текстуры с кадровым буфером по умолчанию. Фреймбуфер по умолчанию исправлен.

Но вы можете скопировать текстуру глубины в стандартный кадровый буфер при рендеринге GBuffer, установив gl_FragDepth в вашем фрагментном шейдере.

2

Другие решения

Вы не можете напрямую использовать текстуру глубины в качестве буфера глубины вашего кадрового буфера по умолчанию. Есть два основных варианта, которые я могу придумать:

  1. Ты можешь использовать glBlitFramebuffer() скопировать буфер глубины из FBO в кадровый буфер по умолчанию. Основные вызовы будут выглядеть примерно так:

    glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
    glBlitFramebuffer(0, 0, _width, _height, 0, 0, _width, _height,
    GL_DEPTH_BUFFER_BIT, GL_NEAREST);
    
  2. Если вам нужно только тестирование глубины, но не обновление буфера глубины, во время прохода, который рендерится с кадровым буфером по умолчанию, вы можете просто связать текстуру глубины и сэмплировать ее в свой фрагментный шейдер. Затем вы сравниваете значение глубины выборки с входящим значением глубины ваших фрагментов и отбрасываете пиксели, которые не прошли тест глубины. Или вы можете попробовать это с sampler2DShadow введите сэмплер и получите результат сравнения глубины чуть более прямо.

2

По вопросам рекламы [email protected]