Variable-Rate Shading (VRS)

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

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

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

Без VRS — сглаживание с несколькими выборками с заменой дискретизации

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

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

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

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

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

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

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

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

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

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

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

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

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

Уровень 1

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

Уровень 2

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

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

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

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

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

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

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

Приложение может указать размер пикселей с помощью метода 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 с переменной скоростью, размер плитки является одним из этих значений.

  • 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-разрядная поверхность (DXGI_FORMAT_R8_UINT).

Ресурсом является измерение TEXTURE2D.

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

Он содержит число выборок 1 и качество выборки 0.

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

Ожидаемый способ заполнения данных изображения экранного пространства — это один из следующих способов:

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

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

  • None
  • ALLOW_UNORDERED_ACCESS
  • DENY_SHADER_RESOURCE

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

  • ALLOW_RENDER_TARGET
  • ALLOW_DEPTH_STENCIL
  • ALLOW_CROSS_ADAPTER
  • ALLOW_SIMULTANEOUS_ACCESS
  • VIDEO_DECODE_REFERENCE_ONLY

Тип кучи ресурса не может быть UPLOAD или READBACK.

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

Данные

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

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

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

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

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

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

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

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

Продвижение и упадок

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

Атрибут per-primitive

Атрибут per-primitive добавляет возможность указать термин скорости затенения в качестве атрибута из вызывающей вершины. Этот атрибут имеет плоскую затенение, то есть распространяется на все пиксели в текущем примитиве треугольника или линии. Использование атрибута 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 выводится из этого источника.

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

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

Скорость затенения запросов с помощью SV_ShadingRate

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

Тип

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Center

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

Центроид

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

Примечание

Если на уровне 1 используется грубое затенение пикселей, SampleMask всегда является полной маской. Если 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пикселей параметр offset может указывать более широкий диапазон расположений. Параметр offset выбирает сетку 16x16 для каждого тонкого пикселя и имеет несколько мелких пикселей. Выразимый диапазон и последующее количество используемых битов зависит от размера пикселя. Верхний и левый края грубого пикселя включены, а нижний и правый края — нет.

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

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

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

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

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

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

Двоичное значение Decimal Дробная часть
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

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

Двоичное значение Decimal Дробная часть
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

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

Двоичное значение Decimal Дробная часть
100 000 -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, количество битов покрытия, необходимое для указания, может отличаться. Например, при использовании 4-х ресурсов MSAA, использующих D3D12_SHADING_RATE_2x2, каждый грубый пиксель записывает в четыре мелких пикселя, а каждый мелкий пиксель имеет четыре образца. Это означает, что каждый грубый пиксель записывает в общей сложности 4 * 4 = 16 выборок.

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

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

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

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

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

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

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

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

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

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

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

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

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

Игнорировать

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

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

При использовании грубого заливки пикселей НЕ поддерживается.

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

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

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

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

Охват

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

Пакеты

Вы можете вызывать API заливки переменной скорости в пакете.

Проходы визуализации

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

Вызов API VRS

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

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

Чтобы запросить возможность затенения адаптера с переменной скоростью, вызовите ID3D12Device::CheckFeatureSupport с D3D12_FEATURE::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.