Объекты состояния

В моделях шейдеров версии 6.3 и более поздних версий приложения обладают удобством и гибкостью, позволяя определять объекты состояния DXR непосредственно в коде шейдера HLSL в дополнение к использованию API Direct3D 12.

В HLSL объекты состояния объявляются с помощью следующего синтаксиса:

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
Элемент Описание
Тип
Определяет тип подобъекта. Должен быть одним из поддерживаемых типов подобъектов HLSL.
Имя
Строка ASCII, однозначно идентифицирующая имя переменной.
Поле[1, 2, ...]
Поля подобъекта. Ниже описаны конкретные поля для каждого типа подобъекта.

Список типов подобъектов:

StateObjectConfig

Тип подобъекта StateObjectConfig соответствует структуре D3D12_STATE_OBJECT_CONFIG .

Он имеет одно поле, побитовый флаг, который является одним или обоими из

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

или ноль ни для одного из них.

Пример

StateObjectConfig MyStateObjectConfig = 
{ 
    STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};

GlobalRootSignature

GlobalRootSignature соответствует D3D12_GLOBAL_ROOT_SIGNATURE структуре.

Поля состоят из некоторого количества строк, описывающих части корневой сигнатуры. Дополнительные сведения см. в разделе Указание корневых подписей в HLSL.

Пример

GlobalRootSignature MyGlobalRootSignature =
{
    "DescriptorTable(UAV(u0)),"                     // Output texture
    "SRV(t0),"                                      // Acceleration structure
    "CBV(b0),"                                      // Scene constants
    "DescriptorTable(SRV(t1, numDescriptors = 2))"  // Static index and vertex buffers.
};

LocalRootSignature

LocalRootSignature соответствует структуре D3D12_LOCAL_ROOT_SIGNATURE .

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

Пример

LocalRootSignature MyLocalRootSignature = 
{
    "RootConstants(num32BitConstants = 4, b1)"  // Cube constants 
};

SubobjectToExportsAssocation

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

SubobjectToExportsAssocation соответствует структуре D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION .

Этот вложенный объект объявляется с помощью синтаксиса

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
Элемент Описание
Имя
Строка ASCII, однозначно идентифицирующая имя переменной.
SubobjectName
Строка, идентифицирующая экспортируемый подобъект.
Экспорт
Строка, содержащая список экспортов, разделенный точкой с запятой.

Пример

SubobjectToExportsAssociation MyLocalRootSignatureAssociation =
{
    "MyLocalRootSignature",    // Subobject name
    "MyHitGroup;MyMissShader"  // Exports association 
};

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

RaytracingShaderConfig

Объект RaytracingShaderConfig соответствует структуре D3D12_RAYTRACING_SHADER_CONFIG .

Этот вложенный объект объявляется с помощью синтаксиса

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
Элемент Описание
Имя
Строка ASCII, однозначно идентифицирующая имя переменной.
MaxPayloadSize
Числовое значение максимального хранилища для скаляров (число каждого из которых составляет 4 байта) в полезных данных лучей для связанных шейдеров лучей.
MaxAttributeSize
Числовое значение для максимального числа скаляров (число каждого из которых составляет 4 байта), которые можно использовать для атрибутов в связанных шейдерах трассировки лучей. Значение не может превышать D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES.

Пример

RaytracingShaderConfig MyShaderConfig =
{
    16,  // Max payload size
    8    // Max attribute size
};

RaytracingPipelineConfig

Объект RaytracingPipelineConfig соответствует D3D12_RAYTRACING_PIPELINE_CONFIG структуре.

Этот вложенный объект объявляется с помощью синтаксиса

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
Элемент Описание
Имя
Строка ASCII, однозначно идентифицирующая имя переменной.
MaxTraceRecursionDepth
Числовое ограничение, используемое для рекурсии лучей в конвейере трассировки лучей. Это число от 0 до 31 включительно.

Пример

RaytracingPipelineConfig MyPipelineConfig =
{
    1  // Max trace recursion depth
};

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

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

TriangleHitGroup

Объект TriangleHitGroup соответствует D3D12_HIT_GROUP_DESC структуре, поле "Тип" которой имеет значение D3D12_HIT_GROUP_TYPE_TRIANGLES.

Этот вложенный объект объявляется с помощью синтаксиса

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
Элемент Описание
Имя
Строка ASCII, однозначно идентифицирующая имя переменной.
AnyHitShader
Строковое имя шейдера anyhit для группы попаданий или пустая строка.
Ближайший ХитШадер
Имя строки ближайшего шейдера нажатия для группы попаданий или пустая строка.

Пример

TriangleHitGroup MyHitGroup =
{
    "",                    // AnyHit
    "MyClosestHitShader",  // ClosestHit
};

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

ProceduralPrimitiveHitGroup

Структура ProceduralPrimitiveHitGroup соответствует D3D12_HIT_GROUP_DESC структуре, поле "Тип" которой имеет значение D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE.

Этот вложенный объект объявляется с помощью синтаксиса

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
Элемент Описание
Имя
Строка ASCII, однозначно идентифицирующая имя переменной.
AnyHitShader
Строковое имя шейдера anyhit для группы попаданий или пустая строка.
Ближайший ХитШадер
Имя строки ближайшего шейдера нажатия для группы попаданий или пустая строка.
IntersectionShader
Имя строки шейдера пересечения для группы попаданий или пустая строка.

Пример

ProceduralPrimitiveHitGroup MyProceduralHitGroup
{
    "MyAnyHit",       // AnyHit
    "MyClosestHit",   // ClosestHit
    "MyIntersection"  // Intersection
};

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

Комментарии

Подобъекты имеют понятие "связь" или "какой подобъект идет с каким экспортом".

При указании подобъектов с помощью кода шейдера выбор "какой подобъект передается с каким экспортом" соответствует правилам, изложенным в спецификации DXR. В частности, предположим, что приложение выполняет экспорт. Если приложение связывает экспорт с корневой подписью A через код шейдера и корневую сигнатуру B через код приложения, используется B. Конструкция "использовать B" вместо "произвести ошибку" дает приложениям возможность удобно переопределять сопоставления DXIL с помощью кода приложения, а не принудительно компилировать шейдеры для устранения несоответствий.

Запись блога разработчика DirectX "Новые возможности В D3D12 — DirectX Raytracing (DXR) теперь поддерживает подобъекты библиотеки"

Функциональная спецификация DirectX Raytracing (DXR)

Пример: D3D12RaytracingLibrarySubobjects