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


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

С моделями шейдера 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 для группы попаданий или пустая строка.
БлижайшийHitShader
Строковое имя ближайшего шейдера попадания для группы попаданий или пустая строка.

Пример:

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

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

ПроцедурнаяPrimitiveHitGroup

ПроцедурнаяPrimitiveHitGroup соответствует структуре D3D12_HIT_GROUP_DESC, поле Type которого имеет значение D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE.

Этот подобъект объявлен синтаксисом

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

Пример:

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

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

Замечания

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

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

запись блога разработчика DirectX "New in D3D12 – DirectX Raytracing (DXR) теперь поддерживает вложенные объекты библиотеки"

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

пример : D3D12RaytracingLibrarySubjects