Поделиться через


Консервативная растеризация Direct3D 12

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

Общие сведения

Консервативная растеризация означает, что все пиксели, которые по крайней мере частично покрыты отрисованным примитивом, будут растеризованы. Это означает, что вызывается пиксельный шейдер. Обычное поведение — выборка, которая не используется, если включена консервативная растеризация.

Консервативная растеризация полезна в ряде ситуаций, в том числе для определенности при обнаружении столкновений, отбраковке окклюзии и отрисовке фрагментов.

Например, на следующем рисунке показан зеленый треугольник, отрисованный с помощью консервативной растеризации, как в средстве растеризации (то есть с координатами вершин с фиксированной точкой 16,8). Коричневая область известна как «область неопределенности» — концептуальная область, представляющая расширенные границы треугольника, необходимая для обеспечения того, чтобы примитив в растеризаторе был консервативным по отношению к исходным координатам вершин с плавающей запятой. Красные квадраты на каждой вершине показывают, как вычисляется область неопределенности: как заметен квадрат.

Большие серые квадраты показывают пиксели, которые будут отрисованы. В розовых квадратах отображаются пиксели, отрисовываемые с помощью "правила верхнего левого края", которое вступает в игру, когда край треугольника пересекает край пикселей. Могут быть ложные срабатывания (пиксели, которые не должны были быть), которые система будет обычно, но не всегда выравливает.

правило левого верхнего уровня

Взаимодействие с конвейером

Взаимодействие с правилами растеризации

В режиме консервативной растеризации правила растеризации применяются так же, как и в случае, если режим консервативной растеризации не включен с исключениями для правила Top-Left, описанного выше, и для пиксельного покрытия. 16.8 Fixed-Point необходимо использовать точность растеризатора.

Пиксели, которые не будут охвачены, если бы оборудование использовало полные координаты вершин с плавающей запятой, можно включать только в том случае, если они находятся в области неопределенности, не больше половины пикселя в домене с фиксированной точкой. Ожидается, что будущее оборудование достигнет региона с ужесточением неопределенности, указанного на уровне 2. Обратите внимание, что это требование предотвращает расширение щебок треугольников дальше, чем это необходимо.

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

Внутренние и внешние области неопределенности должны быть больше или равны размеру половины подпиксельной сетки или 1/512 пикселя в области фиксированной точки. Это минимальный допустимый регион неопределенности. 1/512 происходит из представления координат растеризатора с фиксированной точкой 16,8 и правила округления к ближайшему, которое применяется при преобразовании координат вершин с плавающей запятой в координаты фиксированной точки 16,8. 1/512 может измениться при изменении точности растеризатора. Если реализация реализует эту минимальную область неопределенности, она должна следовать правилу Top-Left, когда край или угол области неопределенности падает вдоль края или угла пикселя. Обрезанные края области неопределенности должны рассматриваться как ближайшие вершины. Это означает, что она считается двумя ребрами: двумя, которые соединяются в связанной вершине. Top-Left правило является обязательным, если используется область минимальной неопределенности, так как в противном случае реализация консервативной растеризации не сможет растеризировать пиксели, которые могут быть охвачены при отключении режима консервативной растеризации.

На следующей схеме показана допустимая внешняя область неопределенности, созданная путем развертки квадрата вокруг краев примитива в области с фиксированной точкой (т. е. вершины были квантизованы представлением фиксированной точки 16,8). Размеры этого квадрата основаны на допустимом размере области внешней неопределенности: для 1/2 пикселя квадрат равен 1 пикселю в ширину и высоту, для 1/512 пикселя квадрат равен 1/256 пикселя в ширину и высоту. Зеленый треугольник представляет данный примитив, красная пунктирная линия представляет собой границу при переоценке консервативной растеризации, сплошные черные квадраты представляют квадрат, который прокатился по краям примитива, а синяя клетчатая область — это область внешней неопределенности:

внешняя область неопределенности.

Взаимодействие с несколькими выборками

Независимо от количества выборок в поверхностях RenderTarget/DepthStencil (или используется ли ForcedSampleCount ), все выборки охватываются пикселями, растровыми с помощью консервативной растеризации. Отдельные расположения выборок не проверяются на то, попадают ли они в примитив.

Пример взаимодействия с маской

Состояние растеризатора SampleMask применяется так же, как и в случае, когда консервативная растеризация не включена для InputCoverage, но не влияет ( InnerCoverage т. е. не вставляется во входные данные, объявленные с InnerCoverage). Это связано InnerCoverage с тем, что не связано с тем, маскируются ли примеры MSAA: 0 InnerCoverage означает только, что пиксель не гарантированно будет полностью охвачен, а не то, что выборки не будут обновлены.

Взаимодействие с тестом глубины и набора элементов

Тестирование глубины и трафарета выполняется для консервативно растеризованного пикселя так же, как если бы все образцы были охвачены, если консервативная растеризация не включена.

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

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

Взаимодействие вспомогательного пикселя

Правила вспомогательного пикселя применяются так же, как и при отключении консервативной растеризации. В рамках этого все пиксели, включая вспомогательные пиксели, должны точно сообщать InputCoverage , как указано в InputCoverage разделе взаимодействия. Таким образом, полностью не покрытые пиксели сообщают о покрытии 0.

Взаимодействие с покрытием выходных данных

Покрытие выходных данных (oMask) ведет себя для консервативно растеризованного пикселя так же, как если консервативная растеризация включена не для всех примеров.

Взаимодействие InputCoverage

В режиме консервативной растеризации этот входной регистр заполняется так, как если бы все выборки были охвачены, если консервативная растеризация не включена для заданного консервативно растеризованного пикселя. То есть применяются все существующие взаимодействия (например, применяется SampleMask ), а первые n битов в InputCoverage из LSB устанавливаются в значение 1 для консервативно растеризованного пикселя, учитывая n выборки на пиксель RenderTarget и/или буфер DepthStencil , привязанный при слиянии выходных данных, или n выборки ForcedSampleCount. Остальные биты — 0.

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

Взаимодействие InnerCoverage

Эта функция требуется для уровня 3 и доступна только на уровне 3. Среда выполнения не сможет создать шейдер для шейдеров, использующих этот режим, если реализация поддерживает уровень ниже уровня 3.

Пиксельный шейдер имеет доступное 32-разрядное скалярное целочисленное системное значение: InnerCoverage. Это битовое поле, для которого бит 0 из LSB имеет значение 1 для заданного консервативно растеризованного пикселя, только если этот пиксель гарантированно находится полностью внутри текущего примитива. Все остальные биты регистра ввода должны иметь значение 0, если бит 0 не задан, но не определены, если бит 0 имеет значение 1 (по сути, это битовое поле представляет логическое значение, где false должно быть ровно 0, но true может быть любым нечетным (то есть битом 0) ненулевое значение). Эти входные данные используются для недооценки сведений о консервативной растеризации. Он сообщает шейдеру пикселей, находится ли текущий пиксель полностью внутри геометрии.

При этом должна учитываться ошибка привязки с разрешениями, превышающими или равными разрешению текущего draw. Ложные срабатывания не должны быть (задание InnerCoverage битов, когда пиксель не полностью охвачен какой-либо ошибкой привязки в разрешениях, больше или равном разрешению, с которым работает текущий draw), но допустимы ложные отрицательные значения. Таким образом, реализация не должна неправильно определять пиксели как полностью покрытые, которые не будут содержать полные координаты вершин с плавающей запятой в растеризаторе.

Пиксели, которые были бы полностью покрыты, если оборудование использовало координаты вершин с плавающей запятой, могут быть опущены только в том случае, если они пересекаются с внутренней областью неопределенности, которая не должна быть больше размера подпиксельной сетки или 1/256 пикселя в домене с фиксированной точкой. С другой стороны, пиксели, полностью находящиеся в пределах внутренней границы внутренней области неопределенности, должны быть помечены как полностью покрытые. Внутренняя граница области неопределенности показана на схеме ниже полужирной черной пунктирной линией. 1/256 происходит из представления координат растеризатора с фиксированной точкой 16,8, которое может измениться при изменении точности растеризатора. Этой области неопределенности достаточно для учета ошибки привязки, вызванной преобразованием координат вершин с плавающей запятой в координаты вершин с фиксированной точкой в средстве растеризатора.

Здесь также применяются те же требования к региону минимальной неопределенности 1/512, которые определены в правилах растеризации.

На следующей схеме показана действительная внутренняя область неопределенности, полученная путем развертки квадрата по краям примитива в области с фиксированной точкой (т. е. вершины были квантизованы с помощью представления фиксированной точки 16,8). Размеры этого квадрата основаны на допустимом внутреннем размере области неопределенности: для 1/256 пикселя квадрат равен 1/128 пикселя по ширине и высоте. Зеленый треугольник представляет собой заданный примитив, полужирная черная пунктирная линия представляет границу внутренней области неопределенности, сплошные черные квадраты представляют квадрат, который заметен вдоль примитивных краев, а оранжевый клетчатая область — это область внутренней неопределенности:

внутренняя неопределенность reqion.

Использование InnerCoverage не влияет на то, является ли пиксель консервативно растеризованным, т. е. использование одного из этих InputCoverage режимов не влияет на то, какие пиксели растеризируются при включенном режиме консервативной растеризации. Таким образом, если InnerCoverage используется и шейдер пикселей обрабатывает пиксель, который не полностью охватывается геометрией, его значение будет равным 0, но при вызове шейдера пикселей будут обновлены примеры. Это отличается от того, когда InputCoverage имеет значение 0, что означает, что примеры не обновляются.

Эти входные данные являются взаимоисключающими с InputCoverage : оба не могут быть использованы.

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

Битовое InnerCoverage поле не влияет на тесты глубины или набора элементов, а также не имеет значения AND с состоянием Растеризатора SampleMask .

Эти входные данные допустимы только в режиме консервативной растеризации. Если консервативная растеризация не включена, InnerCoverage создает неопределенное значение.

Для вызовов шейдера пикселей, вызванных потребностью в вспомогательных пикселях, но не охваченных примитивом, регистр должен иметь InnerCoverage значение 0.

Взаимодействие интерполяции атрибутов

Режимы интерполяции атрибутов не изменяются и движутся так же, как и при консервативной растеризации, где используются вершины с масштабируемым окном просмотра и вершинами с фиксированным преобразованием точек. Так как все выборки в консервативно растеризованном пикселе считаются охваченными, допустимо экстраполировать значения, аналогично использованию режимов интерполяции частоты пикселей в RenderTarget с количеством выборок больше 1. Режимы интерполяции центроидов дают результаты, идентичные соответствующему режиму нецентроидной интерполяции; Понятие центроида в этом сценарии бессмысленно, где охват выборки либо полный, либо равен 0.

Консервативная растеризация позволяет вырожденным треугольникам создавать вызовы шейдера пикселей, поэтому для всех интерполированных значений вырожденные треугольники должны использовать значения, присвоенные вершине 0.

Обрезка взаимодействия

Если режим консервативной растеризации включен и зажим глубины отключен (если для состояния растеризатора DepthClipEnable задано значение FALSE), могут возникнуть дисперсии интерполяции атрибутов для сегментов примитива, которые выходят за пределы диапазона 0 <= z <= w, в зависимости от реализации: используются значения констант из точки, где примитив пересекает соответствующую плоскость (близнюю или дальнюю). Интерполяция атрибутов или ведет себя так, как при отключении режима консервативной растеризации. Однако поведение значения глубины одинаково независимо от режима консервативной растеризации, т. е. примитивам, которые находятся за пределами диапазона глубины, необходимо по-прежнему присваивать значение ближайшего предела диапазона глубины окна просмотра. Поведение интерполяции атрибутов в диапазоне 0 <= z <= w должно оставаться неизменным.

Взаимодействие с расстоянием клипа

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

Обратите внимание, что консервативная растеризация может привести к экстраполяции координаты вершины W, что может привести к W <= 0. Это может привести к тому, что реализации расстояния клипа в пикселях будут работать с расстоянием клипа, которое было разделено на недопустимое значение W. Реализации расстояния клипа должны защищаться от вызова растеризации для пикселей, где координата вершины W <= 0 (например, из-за экстраполяций в режиме консервативной растеризации).

Целевое взаимодействие независимой растеризации

Режим консервативной растеризации совместим с целевой независимой растеризацией (TIR). Применяются правила и ограничения TIR, которые ведут себя для консервативно растрированного пикселя, как если бы все образцы охвачены.

Взаимодействие с примитивной топологией IA

Консервативная растеризация не определена для примитивов линий или точек. Поэтому примитивные топологии, указывающие точки или линии, создают неопределенное поведение, если они передаются в единицу растеризатора при включенной консервативной растеризации.

Проверка уровня отладки проверяет, что приложения не используют эти примитивные топологии.

Взаимодействие с запросами

Для консервативно растеризованного пикселя запросы ведут себя так же, как, когда консервативная растеризация не включена, когда охвачены все примеры. Например, для консервативно растеризованного пикселя D3D12_QUERY_TYPE_OCCLUSION и D3D12_QUERY_TYPE_PIPELINE_STATISTICS (от D3D12_QUERY_TYPE) должны вести себя так же, как если консервативная растеризация не включена, если охвачены все выборки.

Вызовы шейдера пикселей должны увеличиваться для каждого консервативно растеризованного пикселя в режиме консервативной растеризации.

Взаимодействие с состоянием выверки

Все состояния cull допустимы в режиме консервативной растеризации и следуют тем же правилам, что и при консервативной растеризации.

При сравнении консервативной растеризации между разрешениями с самим собой или без включенной консервативной растеризации существует вероятность того, что некоторые примитивы могут иметь несовпадение лицевой стороны (т. е. один обращен назад, другой спереди). Приложения могут избежать этой неопределенности, используя D3D12_CULL_MODE_NONE (из D3D12_CULL_MODE) и не используя IsFrontFace системное значение.

Взаимодействие с IsFrontFace

Созданное IsFrontFace системой значение допустимо для использования в режиме консервативной растеризации и соответствует поведению, определенному при отключении консервативной растеризации.

Взаимодействие с режимами заливки

Единственным допустимым D3D12_FILL_MODE для консервативной растеризации является D3D12_FILL_SOLID. Любой другой режим заполнения является недопустимым параметром для состояния растеризатора.

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

Сведения о реализации

Тип растеризации, поддерживаемый в Direct3D 12, иногда называется "чрезмерной консервативной растеризацией". Существует также концепция "Недооцененная консервативная растеризация", которая означает, что растрируются только пиксели, полностью покрытые отрисованным примитивом. Недооценка сведений о консервативной растеризации доступна через пиксельный шейдер с помощью входных данных покрытия, и в качестве режима растеризации доступна только завышенная консервативная растеризация.

Если какая-либо часть примитива перекрывает пиксель, то этот пиксель считается покрытым и затем растрируется. Когда край или угол примитива падает вдоль края или угла пикселя, применение "правила верхнего левого края" зависит от реализации. Однако для реализаций, поддерживающих вырожденные треугольники, вырожденный треугольник вдоль края или угла должен охватывать по крайней мере один пиксель.

Реализации консервативной растеризации могут различаться на разных устройствах и давать ложные срабатывания, что означает, что они могут неправильно решить, что пиксели покрыты. Это может произойти из-за особенностей реализации, таких как примитивный рост или ошибки привязки, присущие координатам вершин с фиксированной точкой, используемым при растеризации. Причина ложноположительных результатов (в отношении координат вершин с фиксированной точкой) является то, что требуется некоторое количество ложноположительных результатов, чтобы реализовать оценку охвата вершин после привязки (т. е. координаты вершин, преобразованные из плавающей запятой в 16,8 фиксированной точки, используемой в растеризаторе), но учитывать охват, полученный исходными координатами вершин с плавающей запятой.

Консервативные реализации растеризации не дают ложноотрицательных значений относительно координат вершин с плавающей запятой для неразрошенных примитивов после привязки: если какая-либо часть примитива перекрывает какую-либо часть пикселя, то пиксель растрируется.

Треугольники, которые являются вырожденными (повторяющиеся индексы в буфере индексов или коллинеарные в трехмерном режиме) или становятся вырожденными после преобразования с фиксированной точкой (коллинеарные вершины в растеризаторе), могут быть отбракованы или не отбираются; оба являются допустимыми поведениями. Вырожденные треугольники должны рассматриваться как обращенные назад, поэтому, если приложение требует определенного поведения, оно может использовать отбраковку с обратной стороны или тест для передней стороны. Вырожденные треугольники используют значения, присвоенные вершине 0 для всех интерполированных значений.

Существует три уровня поддержки оборудования, а также возможность того, что оборудование не поддерживает эту функцию.

  • Уровень 1 обеспечивает максимальную область неопределенности в 1/2 пикселя и не поддерживает дегенератов после привязки. Это хорошо для мозаичного отображения, атласа текстур, создания карты света и подпиксендных карт теней.
  • Уровень 2 снижает максимальный регион неопределенности до 1/256 и требует, чтобы не отбирались дегенераты после привязки. Этот уровень полезен для ускорения алгоритма на основе ЦП (например, для voxelization).
  • Уровень 3 поддерживает максимальный регион неопределенности 1/256 и добавляет поддержку внутреннего покрытия входных данных. Внутреннее покрытие входных данных добавляет новое значение SV_InnerCoverage в высокоуровневый язык заливки (HLSL). Это 32-разрядное скалярное целое число, которое можно указать на входе в пиксельный шейдер и представляет недооцененную информацию о консервативной растеризации (то есть гарантированно ли гарантированное покрытие пикселя). Этот уровень полезен для отбраковки окклюзии.

Сводные данные API

Следующие методы, структуры, перечисления и вспомогательные классы ссылают на консервативную растеризацию:

Видеоруководства по расширенному обучению DirectX: консервативная растеризация

Упорядоченные представления средства программной прорисовки

Отрисовка