Variable-Rate Shading (VRS)
Из-за ограничений производительности графический отрисовщик не всегда может позволить себе обеспечить одинаковый уровень качества для каждой части выходного изображения. Заливка с переменной скоростью или грубое заливка пикселей — это механизм, который позволяет распределять производительность и мощность отрисовки со скоростью, которая зависит от отображаемого изображения.
В некоторых случаях скорость затенения может быть снижена с минимальным или без снижения заметного качества производства; что приводит к повышению производительности, которое, по сути, бесплатно.
Без заливки с переменной скоростью единственным средством управления скоростью затенения является использование сглаживания с несколькими выборками (MSAA) с выполнением на основе выборки (также известное как супервыборка).
MSAA — это механизм для уменьшения геометрических псевдонимов и улучшения качества отрисовки изображения по сравнению с отсутствием MSAA. Количество выборок MSAA, которое может быть 1x, 2x, 4x, 8x или 16x, определяет количество выборок, выделенных для каждого целевого пикселя отрисовки. Количество выборок MSAA должно быть известно при выделении целевого объекта, и его нельзя изменить после этого.
При перераспределении шейдер пикселей вызывается один раз для каждой выборки с более высоким качеством, но и более высокой производительностью по сравнению с выполнением для каждого пикселя.
Приложение может управлять скоростью заливки, выбирая между выполнением на основе пикселей или MSAA-with-supersampling. Эти два варианта не обеспечивают очень точное управление. Кроме того, может потребоваться более низкая скорость затенения для определенного класса объектов по сравнению с остальной частью изображения. Такие объекты могут включать объект за элементом HUD, прозрачность, размытие (глубина поля, движение и т. д.) или оптическое искажение из-за оптики виртуальной реальности. Но это было бы невозможно, потому что качество заливки и затраты фиксированы по всему изображению.
Модель заливки с переменной скоростью (VRS) расширяет расширение supersampling-with-MSAA в противоположное, "грубое пиксель", направление, добавляя концепцию грубого заливки. Здесь заливка может выполняться с более грубой частотой, чем пиксель. Другими словами, группу пикселей можно затенить как единое целое, и результат затем передается во все образцы в группе.
API грубой заливки позволяет приложению указать количество пикселей, принадлежащих группе затенения, или грубых пикселей. Вы можете изменить размер в пикселях после выделения целевого объекта отрисовки. Таким образом, разные части экрана или разные проходы рисования могут иметь разные скорости заливки.
Ниже приведена таблица, в которой описывается, какой уровень MSAA поддерживается для какого размера пикселей для платформ, поддерживающих грубое заливку:
- Для ячеек, помеченных как Y, эта комбинация включена.
- Для ячеек с пометкой Cap эта комбинация условно включается на основе ограничения (AdditionalShadingRatesSupported).
- Для пустых ячеек такое сочетание не поддерживается.
- Для ячеек с полутоном такое сочетание не поддерживается и включает отслеживание более 16 выборок на вызов шейдера пикселей. Для отслеживания более 16 примеров существуют дополнительные барьеры для выравнивания оборудования, по сравнению с другими случаями.
Существует два уровня реализации VRS и две возможности, которые можно запрашивать. Каждый уровень описывается более подробно после таблицы.
- Скорость затенения может быть указана только для каждого розыгрыша; не более детализированный, чем это.
- Скорость заливки применяется равномерно к тому, что рисуется независимо от того, где она находится в целевом объекте отрисовки.
- Скорость заливки можно указать для каждого розыгрыша, как в случае уровня 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.
Макет текстуры неизвестен. Он неявно не может быть основным макетом строки, так как перекрестный адаптер не допускается.
Ожидаемый способ заполнения данных изображения экранного пространства — это один из следующих способов:
- Запись данных с помощью вычислительного шейдера; изображение экранного пространства привязано к БПЛА, или
- Скопируйте данные на изображение экранного пространства.
При создании изображения экранного пространства эти флаги разрешены.
- 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 — это настраиваемая семантика с именем SV_ShadingRate
.
SV_ShadingRate
существует как часть модели HLSL шейдера 6.4.
Если VS или GS задает SV_ShadingRate
, но VRS не включен, то семантическая настройка не оказывает влияния. Если значение для SV_ShadingRate
не указано для примитивов, то значение скорости заливки 1x1 принимается как вклад для каждого примитива.
Различные источники скорости заливки применяются последовательно на этой схеме.
Каждая пара 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 сбрасывает частоту, заданную состоянием конвейера, до значения по умолчанию, а для выбора изображения экранного пространства — значение по умолчанию "без изображения экранного пространства".
Полезно знать, какая скорость затенения была выбрана оборудованием при любом вызове пиксельного шейдера. Это может обеспечить различные оптимизации в коде PS. Системная переменная только SV_ShadingRate
для PS предоставляет сведения о скорости заливки.
Тип этой семантики — uint.
Данные интерпретируются как значение перечисления D3D12_SHADING_RATE .
Если грубое затенение пикселей не используется, то 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 по сравнению с тем, когда не используются грубые пиксели.
Входные данные для пиксельного шейдера могут быть интерполированы на основе их исходных вершин. Поскольку заливка переменной скорости влияет на области целевого объекта, записанные при каждом вызове шейдера пикселей, оно взаимодействует с интерполяцией атрибутов. К трем типам интерполяции относятся центр, центроид и выборка.
Расположение интерполяции по центру для грубого пикселя — это геометрический центр всей области грубого пикселя.
SV_Position
всегда интерполируется в центре области грубого пикселя.
Если используется грубое затенение пикселей с MSAA, для каждого тонкого пикселя по-прежнему будет выполняться запись в полное количество выборок, выделенных для уровня MSAA целевого объекта. Таким образом, расположение интерполяции центроидов будет учитывать все выборки для мелких пикселей в грубых пикселях. При этом расположение интерполяции центроидов определяется как первая охваченная выборка в порядке увеличения индекса выборки. Эффективное покрытие примера — and-ed с соответствующим битом состояния растеризатора SampleMask.
Примечание
Если на уровне 1 используется грубое затенение пикселей, SampleMask всегда является полной маской. Если sampleMask не является полной маской, то на уровне 1 грубая заливка пикселей отключена.
Выполнение на основе выборки или супервыборка, вызванная использованием функции интерполяции выборки, может использоваться с грубым заливкой пикселей, что приводит к вызову пиксельного шейдера для каждой выборки. Для целевых объектов с числом выборок N шейдер пикселей вызывается N раз на мелкий пиксель.
Встроенные функции модели по запросу несовместимы с грубым заливкой пикселей на уровне 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
параметра смещения для каждого размера в пикселях.
Размер в пикселях | Индексируемый диапазон | Размер представляющего диапазона | Необходимое число битов {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
сетка оцениваемых расположений центрируется в центре грубого пикселя при использовании грубой заливки пикселей.
Если API ID3D12GraphicsCommandList1::SetSamplePositions используется с грубым заливкой, API задает позиции образца для мелких пикселей.
Если SV_Coverage
на уровне 1 объявлен в качестве входных или выходных данных шейдера, то грубое заливка пикселей отключается.
Вы можете использовать семантику SV_Coverage
с грубым заливкой пикселей на уровне 2, и она отражает, какие образцы целевого объекта MSAA записываются.
Если используется грубая заливка пикселей, позволяющая создать плитку несколькими исходными пикселями, маска покрытия представляет все образцы, полученные из этой плитки.
Учитывая совместимость грубой заливки пикселей с MSAA, количество битов покрытия, необходимое для указания, может отличаться. Например, при использовании 4-х ресурсов MSAA, использующих D3D12_SHADING_RATE_2x2, каждый грубый пиксель записывает в четыре мелких пикселя, а каждый мелкий пиксель имеет четыре образца. Это означает, что каждый грубый пиксель записывает в общей сложности 4 * 4 = 16 выборок.
В следующей таблице показано, сколько битов покрытия необходимо для каждой комбинации размера пикселей грубого размера и уровня MSAA.
Как указано в таблице, невозможно использовать грубые пиксели для записи в более чем 16 выборок одновременно с помощью функции заливки с переменной скоростью, предоставляемой через Direct3D 12. Это ограничение связано с ограничениями Direct3D 12 в отношении того, с какими уровнями MSAA разрешены размеры пикселей (см. таблицу в разделе С затенение с переменной скоростью (VRS) этой статьи).
Биты маски покрытия соответствуют четко определенному порядку. Маска состоит из охвата пикселей слева направо, а затем сверху вниз (основной столбец). Биты покрытия — это биты низкого порядка в семантике покрытия и плотно упакованы вместе.
В таблице ниже показан формат маски покрытия для поддерживаемых сочетаний размера грубого пикселя и уровня MSAA.
В следующей таблице показано 2 пикселя MSAA, где каждый пиксель имеет две выборки индексов 0 и 1.
Расположение меток выборок в пикселях предназначено для иллюстрирования и не обязательно передает пространственные {X, Y} расположения выборок в этом пикселе; особенно учитывая, что позиции выборки могут быть изменены программным способом. На примеры ссылается индекс на основе 0.
В следующей таблице показаны 4 пикселя MSAA, где каждый пиксель имеет четыре выборки индексов 0, 1, 2 и 3.
При использовании семантики discard
HLSL с грубым заливкой пикселей грубые пиксели отклоняются.
При использовании грубого заливки пикселей НЕ поддерживается.
Блокировки ROV указываются как работающие при гранулярности в пикселях. Если заливка выполняется для каждой выборки, то блокировки работают с степенью детализации выборки.
Вы можете использовать консервативную растеризацию с затенением переменной скорости. При использовании консервативной растеризации с грубым заливкой пикселей мелкие пиксели в грубых пикселях консервативно растеризируются путем получения полного охвата.
При использовании консервативной растеризации семантика покрытия содержит полные маски для мелких пикселей, которые покрыты, и 0 для мелких пикселей, которые не охвачены.
Вы можете вызывать API заливки переменной скорости в пакете.
Api заливки с переменной скоростью можно вызывать в проходе отрисовки.
В следующем разделе описывается, как с помощью 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.