Отложенный рендеринг: использовать буфер глубины из 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 с кадровым буфером по умолчанию для проверки глубины на проходе геометрии?
2 ответа
Вы не можете связать созданные буферы рендеринга или текстуры с кадровым буфером по умолчанию. Фреймбуфер по умолчанию исправлен.
Но вы можете скопировать текстуру глубины в кадровый буфер по умолчанию при рендеринге GBuffer, установив gl_FragDepth
в вашем фрагментном шейдере.
Вы не можете напрямую использовать текстуру глубины в качестве буфера глубины вашего кадрового буфера по умолчанию. Есть два основных варианта, которые я могу придумать:
Ты можешь использовать
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);
Если вам нужно только тестирование глубины, но не обновление буфера глубины, во время прохода, который рендерится с кадровым буфером по умолчанию, вы можете просто связать текстуру глубины и сэмплировать ее в своем фрагментном шейдере. Затем вы сравниваете значение глубины выборки с входящим значением глубины ваших фрагментов и отбрасываете пиксели, которые не проходят тест глубины. Или вы можете попробовать это с
sampler2DShadow
введите сэмплер и получите результат сравнения глубины чуть более прямо.