Как работает мультисэмпл? - PullRequest
9 голосов
/ 14 января 2012

Мне очень интересно понять, как работает мультисэмплинг.Я нашел большую литературу о том, как включить или использовать его, но очень мало информации о том, что он действительно делает для достижения сглаженного рендеринга.Во многих местах я обнаружил противоречивую информацию, которая только смутила меня больше.

Обратите внимание, что Я знаю, как включить и использовать мультисэмплинг (я его уже использую), чтоЯ не знаю, какие данные действительно попадают в мультисэмплерные рендеринг-буферы / текстуры и как эти данные используются в конвейере рендеринга.

Я очень хорошо понимаю, как работает суперсэмплинг, но у мультисэмплинга все еще есть некоторыенепонятные области, которые я хотел бы понять.

вот что говорят спецификации: (OpenGL 4.2)

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

...

Во время мультисэмплирования рендеринг содержимое фрагмента пикселя изменяется двумя способами.Во-первых, каждый фрагмент включает значение покрытия с битами SAMPLES.

...

Во-вторых, каждый фрагмент включает значения глубины SAMPLES и наборы связанных данных вместо одного значения глубины и наборасвязанные данные, которые поддерживаются в режиме рендеринга одной выборки.

Таким образом, каждая выборка содержит отдельный цвет, бит покрытия и глубину.В чем отличие от обычного суперсэмплинга?Для меня это выглядит как «взвешенный» суперсэмплинг, где каждое конечное значение пикселя определяется значением покрытия его выборок, а не простым средним значением, но я очень не уверен в этом.А как насчет координат текстуры на уровне семпла?

Если я сохраню, скажем, нормали в многосэмплированной текстуре RGBF, я буду читать их обратно "сглаженными" (то есть приближающимися к 0) по краям многоугольника?

Фрагментный шейдер вызывается один раз для каждого фрагмента, если только он не использует gl_SampleID, glSampleIn или не имеет спецификатора хранения «sample».Как фрагментный шейдер можно вызвать один раз для каждого фрагмента и получить сглаженный рендеринг?

1 Ответ

5 голосов
/ 14 января 2012

OpenGL в кремниевых графических системах:

http://www -f9.ijs.si / ~ matevz / docs / 007-2392-003 / sgi_html / ch09.html # LE68984-PARENT

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

И эта техническая спецификация (1994) с сайта OpenGL.Подробно объясняется, что делается, если включен MULTISAMPLE_SGIS: http://opengl.org/registry/specs/SGIS/multisample.txt

См. Также этот связанный вопрос: Как значения глубины разрешаются в текстурах OpenGL при мультисэмплинге?

И ответы на этот вопрос, где рекомендуется GL_MULTISAMPLE_ARB: где определен GL_MULTISAMPLE? .Спецификации для GL_MULTISAMPLE_ARB (2002) здесь: http://www.opengl.org/registry/specs/ARB/multisample.txt

...