Что на самом деле делает мой выбор GLFW_SAMPLES?

Что делает установка этой переменной? Например, если я поставлю его на 4, что это значит?

Я прочитал описание на glfw.org (см. здесь: Руководство по работе с окнами GLFW) в разделе раздел «Подсказки, связанные с фреймбуфером». В руководстве говорится: «GLFW_SAMPLES указывает желаемое количество сэмплов для использования в мультисэмплинге. Ноль отключает мультисэмплинг. GLFW_DONT_CARE означает, что у приложения нет предпочтений».

Я также прочитал описание мультисэмплинга в целом (см. здесь: Мультисэмплинг Шон Харгривз).

У меня есть приблизительное представление о том, что означает мультисэмплинг: при изменении размера и перерисовке изображения количество точек, используемых для перерисовки изображения, должно быть достаточно близко друг к другу, чтобы то, что мы видим, было точным представлением изображения. Та же идея возникает с цифровыми осциллографами — скажем, вы дискретизируете синусоидальный сигнал. Если частота дискретизации точно равна частоте (f) волны, осциллограф отображает постоянное напряжение, которое сильно отличается от входного сигнала, который вы надеетесь увидеть. Чтобы избежать этого, теорема Найквиста говорит нам, что мы должны производить выборку с частотой не менее 2f. Так что я вижу, как проблема может возникнуть в компьютерной графике, но я не знаю, какая именно функция

glfwWindowHint(GLFW_SAMPLES, 4); делает.


person Mike Bell    schedule 17.03.2017    source источник


Ответы (1)


Что делает установка этой переменной? Например, если я поставлю его на 4, что это значит?

GLFW_SAMPLES используется для включения мультисэмплинга. Итак, glfwWindowHint(GLFW_SAMPLES, 4) — это способ включить 4-кратное MSAA в вашем приложении.

4x MSAA означает, что каждый пиксель буфера окна состоит из 4 подвыборок, что означает, что каждый пиксель, так сказать, состоит из 4 пикселей. Таким образом, размер буфера 200x100 пикселей на самом деле будет 800x400 пикселей.


Если бы вы создали дополнительный фреймбуфер, который в 4 раза больше экрана. Затем, используя его в качестве сэмплера текстуры с GL_LINEAR в качестве фильтра, можно добиться того же результата. Обратите внимание, что это относится только к 4x MSAA, так как GL_LINEAR берет только 4 сэмпла, ближайших к рассматриваемому пикселю.

Когда дело доходит до сглаживания, то использование MSAA — действительно эффективное, но дорогое решение. Если вы хотите получить очень чистый и красивый результат, то это определенно то, что вам нужно. Обычно выбирают 4x MSAA, так как при его использовании достигается хороший баланс между качеством и производительностью.

Более дешевая альтернатива с точки зрения производительности — использовать FXAA. Это делается на этапе постобработки и обычно не требует затрат. Разница в том, что MSAA рендерит в большем размере и понижает разрешение до желаемого размера без потери качества. В то время как FXAA просто усредняет пиксели как есть, фактически размывая изображение. FXAA обычно дает действительно достойный результат.

Также ваш драйвер, скорее всего, активирует его по умолчанию. Но если это не так, используйте glEnable(GL_MULTISAMPLE).


Наконец, если вы еще этого не сделали, я настоятельно рекомендую прочитать Изучите сглаживание OpenGL. руководство. Это дает действительно глубокое объяснение всего этого.

person vallentin    schedule 17.03.2017
comment
Есть ли подсказка GLFW для FXAA? ссылка на учебник AA не содержит FXAA, хотя в ней упоминается написание шейдера для пользовательского AA. - person TankorSmash; 14.12.2018
comment
@TankorSmash FXAA — это эффект постобработки, выполненный в шейдере. Некоторые ссылки на странице Википедии подробно описывают, как это работает. Но по сути, для каждого пикселя вы усредняете n окружающих текселей. - person vallentin; 14.12.2018