Я делаю приложение отложенного рендеринга с 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 с кадровым буфером по умолчанию для проверки глубины на проходе геометрии?
Вы не можете связать созданные буферы рендеринга или текстуры с кадровым буфером по умолчанию. Фреймбуфер по умолчанию исправлен.
Но вы можете скопировать текстуру глубины в стандартный кадровый буфер при рендеринге 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
введите сэмплер и получите результат сравнения глубины чуть более прямо.