Сглаживание OpenGL SuperSampling?

В офисе мы работаем со старым программным обеспечением GLX/Motif, которое использует AccumulationBuffer OpenGL для реализации сглаживания при сохранении изображений. Наша проблема заключается в том, что Apple удалила AccumulationBuffer из всех своих драйверов (начиная с OS X 10.7.5), а некоторые драйверы Linux, такие как Intel HDxxxx, также не поддерживают его.

Затем я хотел бы обновить код сглаживания программного обеспечения, чтобы сделать его совместимым с большинством современных операционных систем и графических процессоров, но сохранить сгенерированные изображения такими же красивыми, как и раньше (потому что они нужны нам для научных публикаций).

SuperSampling кажется самым старым и самым качественным методом сглаживания, но я не могу найти ни одного примера SSAA, который не использует AccumulationBuffer. Есть ли другой способ реализовать SuperSampling с OpenGL/GLX???


person Fravadona    schedule 06.03.2014    source источник
comment
На какую версию GL вы ориентируетесь? Буфер накопления устарел в GL 3.0 и удален в 3.1 (без GL_ARB_compatibility) / 3.2+ Core. Вот почему вы не найдете их в драйверах OS X или Intel. Рассматривали ли вы вместо накопительного буфера отрисовку в FBO с некоторым целым числом, кратным размерам вашего буфера кадра по умолчанию, а затем выполнение понижающей дискретизации позже с использованием простого фильтра GL_LINEAR?   -  person Andon M. Coleman    schedule 07.03.2014
comment
Привет Андон, спасибо за ответ.   -  person Fravadona    schedule 07.03.2014
comment
Я рассматриваю любой метод, который будет выполнять сглаживание сцены хорошего качества (для сохранения изображений) совместимым образом с древними и современными реализациями OpenGL. Теперь я поищу любой пример понижающей дискретизации GLX FBO GL_LINEAR в Интернете.   -  person Fravadona    schedule 07.03.2014


Ответы (1)


Вы можете использовать FBO для реализации того же типа сглаживания, который вы, скорее всего, использовали с буферами накопления. Процесс почти такой же, за исключением того, что вы используете текстуру/буфер рендеринга в качестве «накопительного буфера». Вы можете либо использовать два FBO для процесса, либо изменить прикрепленную цель рендеринга одного FBO рендеринга.

В псевдокоде с использованием двух FBO процесс выглядит примерно так:

create renderbuffer rbA
create fboA (will be used for accumulation)
bind fboA
attach rbA to fboA
clear

create texture texB
create fboB (will be used for rendering)
attach texB to fboB
(create and attach a renderbuffer for the depth buffer)

loop over jitter offsets
    bind fboB
    clear
    render scene, with jitter offset applied

    bind fboA
    bind texB for texturing
    set blend function GL_CONSTANT_ALPHA, GL_ONE
    set blend color 0.0, 0.0, 0.0, 1.0 / #passes
    enable blending
    render screen size quad with simple texture sampling shader
    disable blending
end loop

bind fboA as read_framebuffer
bind default framebuffer as draw framebuffer
blit framebuffer

Также возможен полный суперсэмплинг. Как предложил Андон в комментарии выше, вы создаете FBO с целью рендеринга, которая кратна размеру вашего окна в каждом измерении, и, в конце, выполняете масштабирование вашего окна с уменьшением масштаба. Все это имеет тенденцию быть медленным и использовать много памяти, даже с коэффициентом 2.

person Reto Koradi    schedule 17.05.2014