OpenGL: постобработка + мультисэмплинг =?
Я довольно новичок в OpenGL и пытаюсь понять, как добавить этап постобработки в рендеринг сцены. До сих пор я знаю, что знаю, что я создаю FBO, отрисовываю сцену для этого, а затем я могу рендерить в задний буфер, используя мой шейдер постобработки с текстурой из FBO в качестве входных данных.
Но где это выходит за рамки моего познания, это когда используется мультисэмплинг. FBO должен быть мультисэмплингом. Это оставляет две возможности: 1. шейдер пост-обработки работает 1:1 на подвыборках для генерации окончательного вывода мультисэмплированного экрана, или 2. шейдер должен разрешить несколько выборок и вывести один фрагмент экрана для каждого пикселя экрана. Как это можно сделать?
1 ответ
Что ж, вариант 1 поддерживается в GL через функции, представленные через GL_ARB_texture_multisample (в ядре, начиная с GL 3.2). В основном это приносит новые типы текстур с несколькими сэмплами, и соответствующие сэмплеры, такие как sampler2DMS
где вы явно можете получить из конкретного образца индекса. Если этот подход может быть эффективно использован для реализации вашего эффекта пост-обработки, я не знаю.
Вариант 2 немного отличается от того, что вы описываете. Не шейдер будет выполнять мультисэмплирование. Вы можете выполнить рендеринг в мультисэмпловый FBO (для этого не нужна текстура, рендер-буфер тоже подойдет) и выполнить разрешение явно, используя glBlitFramebuffer
в другое, не мультисэмплированное FBO (на этот раз с текстурой). Эту текстуру, не являющуюся мультисэмплом, можно затем использовать в качестве входных данных для последующей обработки. И ни постобработка, ни стандартный кадровый буфер вообще не должны знать о мультисэмплинге.