Мультисэмплинг в трубопроводе
При многократной выборке во время растеризации в каждом пикселе имеется более одной точки выборки, и выбираются точки выборки, которые составляют примитив.
какие атрибуты одинаковы для каждого образца в пикселе? Я где-то читал, что значения цвета и текстуры одинаковы, но значения глубины и размера для образцов в пикселе различны. Но так как фрагментный шейдер выполняется для каждой точки выборки, то они должны быть разными.
Кроме того, когда несколько образцов разрешаются в конвейере, после фрагментного шейдера? И они линейно усредняются?
1 ответ
Сначала вы должны понять, как работает мультисэмплинг и почему он был создан.
Я собираюсь подойти к этому с точки зрения сглаживания, потому что это был основной вариант использования мультисэмплинга до тех пор, пока в GL3 не были введены мультисэмпл-текстуры.
Когда что-то является мультисэмплированным, это означает, что каждая точка выборки содержит несколько выборок. Эти сэмплы могут быть идентичны друг другу, если примитив имеет относительно однородные характеристики (например, имеет одинаковую глубину везде), и реализации интеллектуальных GL/ аппаратных средств способны идентифицировать такие ситуации и уменьшать пропускную способность памяти путем интеллектуального чтения / записи общих сэмплов (аналогично цвету). / сжатие буфера глубины). Однако стоимость с точки зрения требуемого хранилища для 4-кратного кадрового буфера MSAA такая же, как и для 4-кратного SSAA, поскольку GL должен учитывать сценарий наихудшего случая, когда каждый из 4-х выборок уникален.
Какие атрибуты одинаковы для каждого образца в пикселе?
Каждый фрагмент может охватывать несколько точек выборки для таких атрибутов, как цвет, координаты текстуры и т. Д. Вместо того, чтобы вызывать фрагментный шейдер 4 раза так часто, чтобы добиться 4-кратного сглаживания, был разработан трюк, в котором каждый атрибут был бы выбран в центре фрагмента (это по умолчанию), а затем один выход записывается в каждое из покрытых образцов мест. Поведение по умолчанию несколько отсутствует в ситуации, когда центр фрагмента не является частью фактической зоны покрытия - для этого была введена выборка центроида... атрибуты вершины будут интерполироваться в центре зоны покрытия примитива внутри фрагмента а не центр самого фрагмента.
Позже, когда придет время записать цвет в буфер кадров, все эти выборки должны быть усреднены для получения одного пикселя; мы называем это мультисэмплом. Это хорошо работает для некоторых вещей, но не решает проблемы наложения имен, возникающие во время затенения фрагментов.
Текстурирование происходит во время выполнения фрагментного шейдера, и это означает, что частота выборки для текстурирования остается неизменной, поэтому MSAA обычно не помогает с наложением текстур. Таким образом, в то время как суперсэмплинг сглаживания улучшает как сглаживание на геометрических краях, так и сглаживание текстуры / шейдера (такие вещи, как зеркальные блики), мультисэмплинг, как правило, только уменьшает "неровности".
Я где-то читал, что значения цвета и текстуры одинаковы, но значения глубины и размера для образцов в пикселе различны.
Короче говоря, все, что вычисляется в фрагментном шейдере, будет одинаковым для всех покрытых образцов. Все, что может быть определено до затенения фрагмента (например, глубина), может варьироваться.
Фрагментные тесты, такие как глубина / трафарет, оцениваются для каждой подвыборки. Но буферы глубины с несколькими выборками имеют некоторые ограничения. Вплоть до D3D 10.1 аппаратное обеспечение не требовало поддержки текстур глубины с несколькими выборками, поэтому вы не могли выбирать буферы глубины с несколькими выборками в фрагментном шейдере.
Но так как фрагментный шейдер выполняется для каждой точки выборки, то они должны быть разными.
Существует функция, называемая образцом затенения, которая может заставить реализацию MSAA работать больше как SSAA, улучшив соотношение между затененными фрагментами и образцами, сгенерированными во время растеризации. Но по умолчанию описываемое вами поведение не является мультисэмплингом.
Когда несколько сэмплов разрешаются в конвейере, после фрагментного шейдера? И они линейно усредняются?
Разрешение мультисэмпла происходит после затенения фрагмента, в любое время вы должны записать содержимое буфера мультисэмплирования в буфер с одиночной выборкой. Это включает в себя такие вещи, как glBlitFramebuffer (...)
, Вы также можете вручную реализовать разрешение мультисэмпла в фрагментном шейдере, если вы используете мультисэмплированные текстуры.
Наконец, в отношении процесса, используемого для разрешения мультисэмпла, это зависит от реализации, как и макет сэмпла. Если вы когда-нибудь откроете панель управления драйвером дисплея и увидите множество доступных вариантов сглаживания, вы увидите несколько вариантов макета образца и алгоритм разрешения MSAA.
Я настоятельно рекомендую вам взглянуть на эту статью. Хотя он относится к D3D10+, а не к OpenGL, общие правила применяются к обоим API (уD3D9 немного другие правила), и качество диаграмм является феноменальным.
В частности, обратите особое внимание на раздел о правилах растеризации MSAA для треугольников, в котором говорится:
Для треугольника тест покрытия выполняется для каждого местоположения образца (не для центра пикселя). Если охватывается более одного местоположения образца, пиксельный шейдер запускается один раз с атрибутами, интерполированными в центре пикселя. Результат сохраняется (реплицируется) для каждого покрытого местоположения образца в пикселе, который проходит тест глубины / трафарета.