Консервативная растеризация Direct3D 11.3
Консервативная растеризация добавляет некоторую уверенность в отрисовке пикселей, что, в частности, полезно для алгоритмов обнаружения конфликтов.
Общие сведения
Консервативная растеризация означает, что все пиксели, которые по крайней мере частично покрыты отрисованным примитивом, растеризируются. Это означает, что вызывается пиксельный шейдер. Обычное поведение — выборка, которая не используется, если включена консервативная растеризация.
Консервативная растеризация полезна в ряде ситуаций, в том числе для обеспечения определенности при обнаружении столкновений, отбраковке окклюзии и обнаружении видимости.
Например, на следующем рисунке показан зеленый треугольник, отрисованный с помощью консервативной растеризации. Коричневая область известна как "область неопределенности" - область, где ошибки округления и другие вопросы добавляют некоторую неопределенность в точные размеры треугольника. Красные треугольники на каждой вершине показывают, как вычисляется область неопределенности. Большие серые квадраты показывают пиксели, которые будут отрисованы. В розовых квадратах отображаются пиксели, отрисовываемые с помощью "верхнего левого правила", которое вступает в игру, когда край треугольника пересекает край пикселей. Могут быть ложные срабатывания (пиксели, которые не должны были быть), которые система будет обычно, но не всегда выравливает.
Взаимодействие с конвейером
Дополнительные сведения о том, как консервативная растеризация взаимодействует с графическим конвейером, см. в разделе D3D12 Консервативная растеризация.
Сведения о реализации
Тип растеризации, поддерживаемый в Direct3D 12, иногда называется "завышенной консервативной растеризацией". Существует также концепция "заниженной консервативной растеризации", которая означает, что растеризуются только пиксели, полностью покрытые отрисованным примитивом. Недооцененная консервативная растеризация информации доступна через пиксельный шейдер за счет использования входных данных покрытия, и в качестве режима растеризации доступна только завышенная консервативная растеризация.
Если какая-либо часть примитива перекрывает пиксель, то этот пиксель считается покрытым и затем растеризуется. Когда край или угол примитива падает вдоль края или угла пикселя, применение правила верхнего левого края зависит от реализации. Однако для реализаций, поддерживающих вырожденные треугольники, вырожденный треугольник вдоль края или угла должен охватывать по крайней мере один пиксель.
Реализации консервативной растеризации могут отличаться на разных аппаратных устройствах и давать ложные срабатывания, что означает, что они могут неправильно решить, что пиксели покрыты. Это может произойти из-за особенностей реализации, таких как примитивный рост или ошибки привязки, присущие координатам вершин с фиксированной точкой, используемым при растеризации. Причина, по которой ложные срабатывания (в отношении координат вершин фиксированной точки) являются допустимыми, заключается в том, что для реализации необходимо некоторое количество ложноположительных результатов для оценки покрытия для вершин после привязки (т. е. координаты вершин, которые были преобразованы из плавающей запятой в 16,8 фиксированной точки, используемой в средстве растеризатора), но учитывайте охват, полученный исходными координатами вершин с плавающей запятой.
Консервативные реализации растеризации не дают ложноотрицательных значений относительно координат вершин с плавающей запятой для неуниверсальных примитивов после прикрепления: если какая-либо часть примитива перекрывает любую часть пикселя, то пиксель растеризуется.
Треугольники, которые дегенерируются (повторяющиеся индексы в буфере индекса или коллинеарные в трехмерном режиме) или дегенерируются после преобразования с фиксированной точкой (коллинеарные вершины в растеризаторе), могут быть отбракованными или не отбракованными; Оба являются допустимыми поведениями. Вырожденные треугольники следует рассматривать как обратную сторону, поэтому, если приложение требует определенного поведения, оно может использовать отбраковку с обратной стороны или тест для передней стороны. Вырожденные треугольники используют значения, присвоенные вершине 0, для всех интерполированных значений.
Существует три уровня поддержки оборудования, а также возможность того, что оборудование не поддерживает эту функцию.
- Уровень 1 поддерживает области неопределенности в 1/2 пикселя и не вырождает после привязки. Это хорошо подходит для мозаичного отрисовки, атласа текстур, создания карты света и подпиксельных карт теней.
- Уровень 2 добавляет дегенерации после оснастки и 1/256 регионов неопределенности. Он также добавляет поддержку ускорения алгоритма на основе ЦП (например, voxelization).
- Уровень 3 добавляет 1/512 регионов неопределенности, внутренний охват входных данных и поддерживает отбраковку окклюзии. Объем входных данных добавляет новое значение
SV_InnerCoverage
к языку HLSL. Это 32-разрядное скалярное целое число, которое можно указать на входных данных в шейдер пикселей, и представляет недооценку сведений о консервативной растеризации (т. е. является ли пиксель гарантированно полностью покрытым).
Сводные данные API
Следующие методы, структуры, перечисления и вспомогательные классы ссылались на консервативную растеризацию:
- D3D11_RASTERIZER_DESC2 : структура, содержащая описание растеризатора, отметив CD3D12_RASTERIZER_DESC2 вспомогательный класс для создания описаний растеризатора.
- D3D11_CONSERVATIVE_RASTERIZATION_MODE : значения перечисления для режима (включено или выключено).
- D3D11_FEATURE_DATA_D3D11_OPTIONS2 : структура, содержащая уровень поддержки.
- D3D11_CONSERVATIVE_RASTERIZATION_TIER : значения перечисления для каждого уровня поддержки оборудования.
- ID3D11Device::CheckFeatureSupport : метод для доступа к поддерживаемым функциям.