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


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

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

Обзор

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

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

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

отображается верхнего левого правила

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

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

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

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

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

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

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

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

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

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

Сводка по API

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