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


Заливка переменной скорости (VRS)

Мотивация для VRS

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

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

Без VRS — мультикамерная защита от псевдонима с суперсамплингом

Без заливки с переменной скоростью единственным средством управления скоростью заливки является использование много примеров защиты от псевдонима (MSAA) с выполнением на основе выборки (также известное как суперсамплинг).

MSAA — это механизм уменьшения геометрического псевдонима и улучшения качества отрисовки изображения по сравнению с отсутствием использования MSAA. Число примеров MSAA, которое может быть 1x, 2x, 4x, 8x или 16x, определяет количество выборок, выделенных на целевой пиксель отрисовки. Число примеров MSAA должно быть известно заранее, когда целевой объект выделен, и его нельзя изменить после этого.

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

Приложение может управлять скоростью заливки, выбрав между выполнением на основе пикселей или MSAA-with-supersampling. Эти два варианта не обеспечивают очень тонкого контроля. Кроме того, может потребоваться более низкая скорость заливки для определенного класса объектов по сравнению с остальным изображением. Такие объекты могут включать объект за элементом HUD или прозрачностью, размытием (глубиной поля, движением и т. д.) или оптическим искажением из-за оптики VR. Но это не возможно, потому что качество заливки и затраты фиксируются на протяжении всего изображения.

С заливкой переменной скорости (VRS)

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

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

Ниже приведена таблица, описывающая уровень MSAA, с которым поддерживается размер грубого пикселя для платформ, поддерживающих грубое заливка:

  • Для ячеек, помеченных Y, эта комбинация включена.
  • Для ячеек, помеченных cap, это сочетание условно включено на основе ограничения (AdditionalShadingRatesSupported).
  • Для пустых ячеек это сочетание не поддерживается.
  • Для ячеек, которые являются полутонными оттенками, эта комбинация не поддерживается, и включает отслеживание более 16 выборок на вызов шейдера пикселей. Для отслеживания более 16 примеров существуют дополнительные барьеры выравнивания оборудования для поддержки, по сравнению с другими случаями.

таблица показывает размер грубого пикселя для уровней M S A.

Уровни компонентов

Существует два уровня реализации VRS и две возможности, которые можно запросить. Каждый уровень подробно описан после таблицы.

в таблице показаны функции, доступные на уровне 1 и уровне 2.

Уровень 1

  • Скорость заливки может быть указана только на основе рисования; не более детализирован, чем это.
  • Скорость заливки применяется равномерно к тому, что рисуется независимо от того, где она находится в целевом объекте отрисовки.

Уровень 2

  • Скорость заливки может быть указана на основе нарисовки, как и на уровне 1. Кроме того, его можно указать сочетанием на основе рисования и следующим образом:
    • Семантика из каждой вызывающей вершины и
    • изображение пространства экрана.
  • Ставки заливки из трех источников объединяются с помощью набора комбинаторов.
  • Размер плитки изображения в пространстве экрана составляет 16x16 или меньше.
  • Скорость заливки, запрошенная приложением, гарантированно будет доставлена точно (для точности темпоральных и других фильтров реконструкции).
  • поддерживается SV_ShadingRate входных данных PS.
  • Скорость заливки для каждого провоцирования вершин (также известная как примитивная) допустима, если используется один порт просмотра и SV_ViewportArrayIndex не записывается в.
  • Скорость вершин с провоцированием может использоваться с несколькими окнами просмотра, если для поддерживается ПоддержкаPerVertexShadingRateWithMultipleViewports для true. Кроме того, в этом случае эта ставка может использоваться при записи SV_ViewportArrayIndex.

Список возможностей

  • AdditionalShadingRatesSupported
    • Логический тип.
    • Указывает, поддерживаются ли размеры пикселей 2x4, 4x2 и 4x4 для однокамерной отрисовки; и поддерживается ли размер пикселя 2x4 для 2x MSAA.
  • ПоддерживаетPerVertexShadingRateWithMultipleViewports
    • Логический тип.
    • Указывает, можно ли использовать несколько представлений с частотой заливки для каждой вершины (также известной как примитивная).

Указание скорости заливки

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

Список команд

Это самый простой механизм настройки скорости заливки. Он доступен на всех уровнях.

Приложение может указать размер грубого пикселя с помощью метода ID3D12GraphicsCommandList5::RSSetShadingRate. Этот API принимает один аргумент перечисления. API предоставляет общий контроль уровня качества отрисовки — возможность задать частоту заливки на основе нарисовки.

Значения этого состояния выражаются с помощью перечисления D3D12_SHADING_RATE.

Поддержка грубого размера пикселей

Ставки заливки 1x1, 1x2, 2x1 и 2x2 поддерживаются на всех уровнях.

Существует возможность, AdditionalShadingRatesSupported, чтобы указать, поддерживаются ли на устройстве 2x4, 4x2 и 4x4.

Изображение пространства экрана (на основе изображений)

На уровне 2 и выше можно указать частоту заливки пикселей с изображением пространства экрана.

Изображение пространства экрана позволяет приложению создавать "маску уровня детализации (LOD), указывающую области различных качества, такие как области, которые будут охватываться размытием движения, размытием глубины поля, прозрачными объектами или элементами пользовательского интерфейса HUD. Разрешение изображения находится в макроблоках; Он не находится в разрешении целевого объекта отрисовки. Другими словами, данные о частоте заливки указываются с степенью детализации 8x8 или 16x16 пикселей, как указано размером плитки VRS.

Размер плитки

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

Плитки являются квадратными, и размер ссылается на ширину или высоту плитки в текселях.

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

Если аппаратное поддерживает заливку уровня 2 уровня 2, размер плитки является одним из этих значений.

  • 8
  • 16
  • 32

Размер изображения в пространстве экрана

Для целевого объекта отрисовки размера {rtWidth, rtHeight}, используя заданный размер плитки с именем VRSTileSize, изображение пространства экрана, которое будет охватывать его из этих измерений.

{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }

Верхний левый (0, 0) изображения экрана заблокирован в левом верхнем углу целевого объекта отрисовки (0, 0).

Чтобы найти координату (x,y) плитки, соответствующей определенному расположению в целевом объекте отрисовки, разделите координаты пространства окна (x, y) по размеру плитки, игнорируя дробные биты.

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

Если изображение пространства экрана слишком мало для заданного целевого объекта отрисовки, любая попытка прочитать из изображения за пределы фактических экстентов дает частоту заливки по умолчанию 1x1. Это связано с тем, что верхний левый (0, 0) изображения экрана заблокирован в левом верхнем углу целевого объекта отрисовки (0, 0) и "чтение за пределами экстентов целевого объекта отрисовки" означает слишком большое количество значений для x и y.

Формат, макет, свойства ресурса

Формат этой поверхности — это 8-разрядная 8-разрядная поверхность (DXGI_FORMAT_R8_UINT).

Ресурс — это измерение TEXTURE2D.

Он не может быть массивирован или митрирован. Он должен явно иметь один уровень MIP.

Он имеет число выборок 1 и качество образца 0.

Он содержит макет текстуры UNKNOWN. Он неявно не может быть макетом основной строки, так как кроссплатформенный не допускается.

Ожидаемый способ заполнения данных изображения с экрана

  1. Запись данных с помощью шейдера вычислений; Изображение пространства экрана привязано к UAV или
  2. Скопируйте данные на изображение пространства экрана.

При создании изображения пространства экрана эти флаги разрешены.

  • НИКАКОЙ
  • ALLOW_UNORDERED_ACCESS
  • DENY_SHADER_RESOURCE

Эти флаги запрещены.

  • ALLOW_RENDER_TARGET
  • ALLOW_DEPTH_STENCIL
  • ALLOW_CROSS_ADAPTER
  • ALLOW_SIMULTANEOUS_ACCESS
  • VIDEO_DECODE_REFERENCE_ONLY

Тип кучи ресурса не может быть ОТПРАВЛЕН или READBACK.

Ресурс не может быть SIMULTANEOUS_ACCESS. Ресурс не допускается для перекрестного адаптера.

Данные

Каждый байт изображения экрана соответствует значению перечисления D3D12_SHADING_RATE.

Состояние ресурса

Ресурсу необходимо перейти в состояние только для чтения при использовании в качестве изображения пространства экрана. Для этой цели определяется состояние только для чтения, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.

Ресурс изображения перемещается из этого состояния, чтобы снова стать записываемым.

Настройка образа

Изображение пространства экрана для указания скорости шейдера устанавливается в списке команд.

Ресурс, заданный как источник частоты заливки, не может быть прочитан или записан на любом этапе шейдера.

Можно задать null изображение пространства экрана для указания скорости шейдера. Это имеет эффект 1x1, который постоянно используется в качестве вклада изображения пространства экрана. Изначально изображение пространства экрана можно считать null.

Продвижение и разложение

Ресурс изображения с экрана не имеет особых последствий в отношении повышения или распада.

Атрибут per-primitive

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

Атрибут per-primitive — это семантика набора с именем SV_ShadingRate. SV_ShadingRate существует как часть шейдера HLSL 6.4.

Если наборы VS или GS SV_ShadingRate, но VRS не включены, то семантическая настройка не действует. Если значение для SV_ShadingRate не указано для каждого примитива, то значение затенения 1x1 предполагается как примитивный вклад.

Объединение коэффициентов скорости заливки

Различные источники скорости заливки применяются в последовательности с помощью этой схемы.

Диаграмма показывает состояние конвейера, помеченное A, с провоцированием частоты заливки вершин, меткой B, примененной к комбинатору, а затем скорость заливки на основе изображений, помеченная B, примененная на комбинаторе.

Каждая пара A и B объединяется с помощью комбинатора.

* При указании скорости шейдера по атрибуту вершины.

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

Список комбинаторов

Поддерживаются следующие комбинаторы. Использование комбинатора (C) и двух входных данных (A и B).

  • сквозное. C.xy = A.xy.
  • переопределение. C.xy = B.xy.
  • более высокое качество. C.xy = min(A.xy, B.xy).
  • более низкое качество. C.xy = max(A.xy, B.xy).
  • Применить стоимость B относительно A. C.xy = min(maxRate, A.xy + B.xy).

где maxRate является самым большим разрешенным измерением грубого пикселя на устройстве. Это будет

  • D3D12_AXIS_SHADING_RATE_2X (то есть значение 1), если параметр AdditionalShadingRatesSupported false.
  • D3D12_AXIS_SHADING_RATE_4X (то есть значение 2), если параметр AdditionalShadingRatesSupported true.

Выбор объединения для заливки переменной скорости устанавливается в списке команд через ID3D12GraphicsCommandList5::RSSetShadingRate.

Если комбинаторы никогда не заданы, они остаются по умолчанию, то это PASSTHROUGH.

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

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

Состояние и очистка состояния по умолчанию

Все источники скорости заливки, а именно

  • указанная в списке команд частота состояния конвейера (указанная в списке команд);
  • частота, указанная на изображении экрана, и
  • атрибут per-primitive

имеет значение по умолчанию D3D12_SHADING_RATE_1X1. Комбинаторы по умолчанию : {PASSTHROUGH, PASSTHROUGH}.

Если изображение пространства экрана не указано, то скорость заливки 1x1 выводится из этого источника.

Если ни один примитивный атрибут не указан, то скорость заливки 1x1 выводится из этого источника.

ID3D12CommandList::ClearState сбрасывает заданную по умолчанию частоту состояния конвейера и выбор изображения пространства экрана по умолчанию не соответствует значению "без изображения экрана".

Запрос скорости заливки с помощью SV_ShadingRate

Полезно знать, какая скорость заливки была выбрана оборудованием при любом вызове шейдера пикселей. Это может включать различные оптимизации в коде PS. Системная переменная только для PS, SV_ShadingRate, предоставляет сведения о скорости заливки.

Тип

Тип этой семантики — uint.

Интерпретация данных

Данные интерпретируются как значение перечисления D3D12_SHADING_RATE.

Если VRS не используется

Если грубое заливка пикселей не используется, то SV_ShadingRate считывается обратно как значение 1x1, указывающее на мелкие пиксели.

Поведение при выполнении на основе примера

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

Замечания по отложенной заливки

Может потребоваться отложенное освещение приложения заливки, возможно, потребуется знать, какая скорость заливки использовалась для какой области экрана. Это так, что диспетчеры передач освещения могут запускаться с грубой скоростью. Для этого можно использовать переменную SV_ShadingRate, если она записывается в гбуфер.

Глубина и набор элементов

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

Использование запрошенной частоты заливки

Для всех уровней ожидается, что если запрашивается скорость заливки, и она поддерживается в сочетании на уровне устройства и MSAA, то это скорость заливки, доставленная оборудованием.

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

Поддерживаемая скорость заливки составляет 1x1, 1x2, 2x1 или 2x2 в операции отрисовки, где число выборок меньше или равно четырем. Если функция AdditionalShadingRatesSupportedtrue, то 2x4, 4x2 и 4x4 также поддерживаются тарифы заливки для некоторых выборок (см. таблицу в С затенение переменной (VRS) раздела в этом разделе).

Производные от пространства экрана

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

Так как mips выбираются на основе производного пространства экрана, использование грубой заливки пикселей влияет на выбор MIP. Использование грубой заливки пикселей приводит к тому, что более подробные мипсы будут выбраны по сравнению с тем, когда грубые пиксели не используются.

Интерполяция атрибутов

Входные данные в шейдер пикселей могут быть интерполированы на основе их исходных вершин. Поскольку заливка переменной скорости влияет на области целевого объекта, написанные каждым вызовом шейдера пикселей, он взаимодействует с интерполяцией атрибутов. Три типа интерполяции — центр, центроид и выборка.

Центр

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

Центроид

При использовании грубого заливки пикселей с MSAA для каждого тонкого пикселя по-прежнему будет записываться в полное количество выборок, выделенных для уровня MSAA целевого объекта. Таким образом, расположение интерполяции центроидов будет рассматривать все образцы для мелких пикселей в грубом пикселях. Это говорится, что расположение интерполяции центроидов определяется как первый охваченный выборку, увеличивая порядок выборки индекса. Эффективное покрытие примера — and-ed с соответствующим битом состояния растеризатора SampleMask.

Заметка

При использовании грубой заливки пикселей на уровне 1 образецMask всегда является полной маской. Если SampleMask настроен не на полную маску, то на уровне 1 отключена грубая заливка пикселей.

Выполнение на основе примера

Выполнение на основе примера или суперсамплинг, что вызвано использованием функции интерполяции выборки, может использоваться с грубой заливкой пикселей и приводит к вызову шейдера пикселей для каждого образца. Для целевых объектов числа выборок N шейдер пикселей вызывается N раз на мелкий пиксель.

EvaluateAttributeSnapped

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

Встроенная EvaluateAttributeSnapped допускается использовать с грубой заливкой пикселей на уровне 2. Его синтаксис совпадает с тем, что он всегда был.

numeric EvaluateAttributeSnapped(	
    in attrib numeric value, 
    in int2 offset);

Для контекста EvaluateAttributeSnapped имеет параметр смещения с двумя полями. При использовании без грубой заливки пикселей используются только четыре бита нижнего порядка из полного тридцати двух. Эти четыре бита представляют диапазон [-8, 7]. Этот диапазон охватывает сетку 16x16 в пикселях. Диапазон такой, что верхние и левые края пикселя включены, а нижние и правые края не являются. Смещение (-8, -8) находится в левом верхнем углу, а смещение (7, 7) находится в правом нижнем углу. Смещение (0, 0) — это центр пикселя.

При использовании с затенение пикселей грубого размера параметр смещения EvaluateAttributeSnappedможет указывать более широкий диапазон расположений. Параметр смещения выбирает сетку 16x16 для каждого тонкого пикселя и имеет несколько мелких пикселей. Экспрессивный диапазон и последующее количество используемых битов зависит от размера грубого пикселя. Включены верхние и левые края грубого пикселя, а нижние и правые края не являются.

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

Диапазон смещения EvaluateAttributeSnapped

Размер грубого пикселя Индексируемый диапазон Размер представляющего диапазона Количество битов, необходимых {x, y} Двоичная маска доступных битов
1x1 (штраф) {[-8, 7], [-8, 7]} {16, 16} {4, 4} {0000000000000xxxx, 000000000000xxxx}
1x2 {[-8, 7], [-16, 15]} {16, 32} {4, 5} {00000000000000xxxx, 0000000000xxxx}
2x1 {[-16, 15], [-8, 7]} {32, 16} {5, 4} {000000000000xxxxx, 000000000000xxxx}
2x2 {[-16, 15], [-16, 15]} {32, 32} {5, 5} {000000000000xxxxx, 00000000000x}
2x4 {[-16, 15], [-32, 31]} {32, 64} {5, 6} {000000000000xxx, 000000000x}
4x2 {[-32, 31], [-16, 15]} {64, 32} {6, 5} {00000000000x, 00000000000xxxx}
4x4 {[-32, 31], [-32, 31]} {64, 64} {6, 6} {00000000000x, 000000000xxx}

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

Схема чисел для четырех битовых значений, передаваемых в EvaluateAttributeSnapped, не зависит от заливки переменной скорости. Это вновь повторяется здесь для полноты.

Для четырех битовых значений.

Двоичное значение Десятичный Дробный
1000 -0.5f -8 / 16
1001 -0.4375f -7 / 16
1010 -0.375f -6 / 16
1011 -0.3125f -5 / 16
1100 -0.25f -4 / 16
1101 -0.1875f -3 / 16
1110 -0.125f -2 / 16
1111 -0.0625f -1 /16
0000 0.0f 0 / 16
0001 -0.0625f 1 / 16
0010 -0.125f 2 / 16
0011 -0.1875f 3 / 16
0100 -0.25f 4 / 16
0101 -0.3125f 5 / 16
0110 -0.375f 6 / 16
0111 -0.4375f 7 / 16

Для пяти битовых значений.

Двоичное значение Десятичный Дробный
10000 -1 -16 / 16
10001 -0.9375 -15 / 16
10010 -0.875 -14 / 16
10011 -0.8125 -13 / 16
10100 -0.75 -12 / 16
10101 -0.6875 -11 / 16
10110 -0.625 -10 / 16
10111 -0.5625 -9 / 16
11000 -0.5 -8 / 16
11001 -0.4375 -7 / 16
11010 -0.375 -6 / 16
11011 -0.3125 -5 / 16
11100 -0.25 -4 / 16
11101 -0.1875 -3 / 16
11110 -0.125 -2 / 16
11111 -0.0625 -1 / 16
00000 0 0 / 16
00001 0.0625 1 / 16
00010 0.125 2 / 16
00011 0.1875 3 / 16
00100 0.25 4 / 16
00101 0.3125 5 / 16
00110 0.375 6 / 16
00111 0.4375 7 / 16
01000 0.5 8 / 16
01001 0.5625 9 / 16
01010 0.625 10 / 16
01011 0.6875 11 / 16
01100 0.75 12 / 16
01101 0.8125 13 / 16
01110 0.875 14 / 16
01111 0.9375 15 / 16

Для шести битовых значений.

Двоичное значение Десятичный Дробный
100000 -2 -32 / 16
100001 -1.9375 -31 / 16
100010 -1.875 -30 / 16
100011 -1.8125 -29 / 16
100100 -1.75 -28 / 16
100101 -1.6875 -27 / 16
100110 -1.625 -26 / 16
100111 -1.5625 -25 / 16
101000 -1.5 -24 / 16
101001 -1.4375 -23 / 16
101010 -1.375 -22 / 16
101011 -1.3125 -21 / 16
101100 -1.25 -20 / 16
101101 -1.1875 -19 / 16
101110 -1.125 -18 / 16
101111 -1.0625 -17 / 16
110000 -1 -16 / 16
110001 -0.9375 -15 / 16
110010 -0.875 -14 / 16
110011 -0.8125 -13 / 16
110100 -0.75 -12 / 16
110101 -0.6875 -11 / 16
110110 -0.625 -10 / 16
110111 -0.5625 -9 / 16
111000 -0.5 -8 / 16
111001 -0.4375 -7 / 16
111010 -0.375 -6 / 16
111011 -0.3125 -5 / 16
111100 -0.25 -4 / 16
111101 -0.1875 -3 / 16
111110 -0.125 -2 / 16
111111 -0.0625 -1 / 16
000000 0 0 / 16
000001 0.0625 1 / 16
000010 0.125 2 / 16
000011 0.1875 3 / 16
000100 0.25 4 / 16
000101 0.3125 5 / 16
000110 0.375 6 / 16
000111 0.4375 7 / 16
001000 0.5 8 / 16
001001 0.5625 9 / 16
001010 0.625 10 / 16
001011 0.6875 11 / 16
001100 0.75 12 / 16
001101 0.8125 13 / 16
001110 0.875 14 / 16
001111 0.9375 15 / 16
010000 1 16 / 16
010001 1.0625 17 / 16
010010 1.125 18 / 16
010011 1.1875 19 / 16
010100 1.25 20 / 16
010101 1.3125 21 / 16
010110 1.375 22 / 16
010111 1.4375 23 / 16
011000 1.5 24 / 16
011001 1.5625 25 / 16
011010 1.625 26 / 16
011011 1.6875 27 / 16
011100 1.75 28 / 16
011101 1.8125 29 / 16
011110 1.875 30 / 16
011111 1.9375 31 / 16

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

SetSamplePositions

Если API ID3D12GraphicsCommandList1::SetSamplePositions используется с грубой заливкой, API задает выборку позиций для мелких пикселей.

SV_Coverage

Если SV_Coverage объявлен как входные или выходные данные шейдера на уровне 1, то затенение пикселей отключается.

Вы можете использовать семантику SV_Coverage с грубой заливкой пикселей на уровне 2, и она отражает, какие образцы целевого объекта MSAA записываются.

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

Учитывая совместимость заливки пикселей с MSAA, количество битов покрытия, необходимое для указания, может отличаться. Например, с ресурсом MSAA 4x с помощью D3D12_SHADING_RATE_2x2, каждый грубый пиксель записывает до четырех мелких пикселей, и каждый мелкий пиксель имеет четыре образца. Это означает, что каждый грубый пиксель записывает в общей сложности 4 * 4 = 16 выборок.

Количество битов покрытия, необходимых

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

таблице отображается размер пикселя грубого размера, количество мелких пикселей и уровни A M S A.

Как указано в таблице, нельзя использовать грубые пиксели для записи в более чем 16 выборок за раз с помощью функции заливки переменной скорости, предоставляемой через Direct3D 12. Это ограничение связано с ограничениями Direct3D 12 относительно того, какие уровни MSAA разрешены, с которыми допускается грубое размер пикселя (см. таблицу в С заливкой переменной частоты (VRS) раздел в этом разделе).

Упорядочение и форматирование битов в маске покрытия

Биты маски покрытия соответствуют четко определенному порядку. Маска состоит из охвата пикселей слева направо, а затем сверху вниз (столбец-основной) порядок. Биты покрытия — это биты низкого порядка семантики покрытия и плотно упакованы вместе.

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

в таблице показан размер грубого пикселя, грубая диаграмма пикселей и биты покрытия 1 x М S A A.

В следующей таблице показано 2x пикселей MSAA, где каждый пиксель содержит два образца индексов 0 и 1.

Расположение меток выборок на пикселях предназначено для иллюстрирующих целей и не обязательно передает пространственные расположения выборок {X, Y} на этом пикселе; особенно учитывая, что выборка позиций может быть программно изменена. Примеры ссылаются на их 0-й индекс.

Таблица показывает размер грубого пикселя, грубую диаграмму пикселей и биты покрытия 2 x М S A A.

В следующей таблице показаны 4x пикселей MSAA, где каждый пиксель содержит четыре образца индексов 0, 1, 2 и 3.

таблица показывает размер грубого пикселя, грубую диаграмму пикселей и биты покрытия 4 x М S A A.

Отбрасывать

Если семантическая discard HLSL используется с затенение грубой заливки пикселей, то отбрасываются грубые пиксели.

Независимая от целевого объекта растеризация (TIR)

ТИР не поддерживается при использовании грубой заливки пикселей.

Представления растерного порядка (ROV)

Взаимоблокировки ROV указываются как работающие при тонкой детализации пикселей. Если заливка выполняется на выборку, то взаимоблокировки работают при детализации выборки.

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

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

Охват

При использовании консервативной растризации семантика покрытия содержит полные маски для мелких пикселей, которые покрыты, и 0 для мелких пикселей, которые не покрыты.

Пакеты

Api-интерфейсы заливки переменной скорости можно вызывать в пакете.

Прохождение отрисовки

Api-интерфейсы заливки переменной скорости можно вызывать в передаче.

Вызов API VRS

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

Запросы возможностей

Чтобы запросить возможность заливки переменной скорости адаптера, вызовите ID3D12Device::CheckFeatureSupport с D3D12_FEATURE::D::D 3D12_FEATURE_D3D12_OPTIONS6и предоставьте D3D12_FEATURE_DATA_D3D12_OPTIONS6 структуру для заполнения функции. Структура D3D12_FEATURE_DATA_D3D12_OPTIONS6 содержит несколько элементов, включая один из перечисленных типов D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier), а также один, указывающий, поддерживается ли фоновая обработка (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).

Для запроса возможностей уровня 1, например, это можно сделать.

D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return 
    SUCCEEDED(m_device->CheckFeatureSupport(
        D3D12_FEATURE_D3D12_OPTIONS6, 
        &options, 
        sizeof(options))) && 
    options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;

Ставки заливки

Значения в D3D12_SHADING_RATE перечислении организованы таким образом, чтобы скорости заливки легко разлагались на две оси, где значения каждой оси компактно представлены в логарифмическом пространстве в соответствии с D3D12_AXIS_SHADING_RATE перечислением.

Вы можете создать макрос для создания двух осей заливки в частоту заливки, как это.

#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
    D3D12_AXIS_SHADING_RATE_2X, 
    D3D12_AXIS_SHADING_RATE_1X)

Платформа также предоставляет эти макросы, определенные в d3d12.h.

#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )

Их можно использовать для расчленения и понимания SV_ShaderRate.

Заметка

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

Настройка скорости заливки на уровне команд и комбинаторов

Скорость заливки и, при необходимости, объединения задаются с помощью метода ID3D12GraphicsCommandList5::RSSetShadingRate. Вы передаете D3D12_SHADING_RATE значение для базовой скорости заливки и необязательный массив значений D3D12_SHADING_RATE_COMBINER.

Подготовка изображения пространства экрана

Состояние ресурса только для чтения, обозначающее образ скорости заливки, определяется как D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.

Настройка изображения пространства экрана

Вы указываете изображение пространства экрана с помощью метода ID3D12GraphicsCommandList5::RSSetShadingRateImage.

m_commandList->RSSetShadingRateImage(screenSpaceImage);

Запрос размера плитки

Размер плитки можно запросить из элемента D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize. См. запросы выше.

Одно измерение извлекается, так как горизонтальные и вертикальные измерения всегда одинаковы. Если возможность системы D3D12_SHADING_RATE_TIER_NOT_SUPPORTED, возвращается размер плитки 0.