Objetos de estado

Con los modelos de sombreador 6.3 y versiones posteriores, las aplicaciones tienen la comodidad y flexibilidad de poder definir objetos de estado DXR directamente en el código del sombreador HLSL además de usar las API de Direct3D 12.

En HLSL, los objetos de estado se declaran con esta sintaxis:

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
Artículo Descripción
tipo
Identifica el tipo de subobjeto. Debe ser uno de los tipos de subobjetos HLSL admitidos.
nombre de
Cadena ASCII que identifica de forma única el nombre de la variable.
Campo[1, 2, ...]
Campos del subobjeto. A continuación se describen campos específicos para cada tipo de subobjeto.

Lista de tipos de subobjetos:

StateObjectConfig

El tipo de subobjeto StateObjectConfig corresponde a una estructura D3D12_STATE_OBJECT_CONFIG.

Tiene un campo, una marca bit a bit, que es una o ambas de

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

o bien, cero para ninguno de ellos.

Ejemplo:

StateObjectConfig MyStateObjectConfig = 
{ 
    STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};

GlobalRootSignature

GlobalRootSignature corresponde a una estructura D3D12_GLOBAL_ROOT_SIGNATURE.

Los campos constan de cierto número de cadenas que describen las partes de la firma raíz. Para obtener referencia sobre esto, vea Especificar firmas raíz en HLSL.

Ejemplo:

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 corresponde a una estructura D3D12_LOCAL_ROOT_SIGNATURE.

Al igual que el subobjeto de firma raíz global, los campos constan de cierto número de cadenas que describen las partes de la firma raíz. Para obtener referencia sobre esto, vea Especificar firmas raíz en HLSL.

Ejemplo:

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

SubobjectToExportsAssocation

De forma predeterminada, un subobjeto simplemente declarado en la misma biblioteca que una exportación puede aplicarse a esa exportación. Sin embargo, las aplicaciones tienen la capacidad de invalidar eso y obtener información específica sobre qué subobjeto va con la exportación. En HLSL, esta "asociación explícita" se realiza mediante SubobjectToExportsAssocation.

Un SubobjectToExportsAssocation corresponde a una estructura D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION .

Este subobjeto se declara con la sintaxis

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
Artículo Descripción
nombre de
Cadena ASCII que identifica de forma única el nombre de la variable.
SubobjectName
Cadena que identifica un subobjeto exportado.
exporta
Cadena que contiene una lista delimitada por punto y coma de exportaciones.

Ejemplo:

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

Tenga en cuenta que ambos campos usan nombres de exportados. Un nombre exportado puede ser diferente del nombre original en HLSL, si la aplicación decide realizar el cambio de nombre de exportación.

RaytracingShaderConfig

RaytracingShaderConfig corresponde a una estructura D3D12_RAYTRACING_SHADER_CONFIG.

Este subobjeto se declara con la sintaxis

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
Artículo Descripción
nombre de
Cadena ASCII que identifica de forma única el nombre de la variable.
MaxPayloadSize
Valor numérico para el almacenamiento máximo para escalares (que se cuentan como 4 bytes cada uno) en cargas de rayos para sombreadores de raytrac asociados.
MaxAttributeSize
Valor numérico para el número máximo de escalares (que se cuentan como 4 bytes cada uno) que se pueden usar para atributos en sombreadores raytracing asociados. El valor no puede superar D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES.

Ejemplo:

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

RaytracingPipelineConfig

Una clase RaytracingPipelineConfig corresponde a una estructura D3D12_RAYTRACING_PIPELINE_CONFIG.

Este subobjeto se declara con la sintaxis

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
Artículo Descripción
nombre de
Cadena ASCII que identifica de forma única el nombre de la variable.
MaxTraceRecursionDepth
Límite numérico que se va a usar para la recursividad de rayos en la canalización de raytracing. Es un número comprendido entre 0 y 31, ambos inclusive.

Ejemplo:

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

Dado que hay un costo de rendimiento para la recursividad raytracing, las aplicaciones deben usar la profundidad de recursividad más baja necesaria para los resultados deseados.

Si las invocaciones del sombreador aún no han alcanzado la profundidad máxima de recursividad, pueden llamar a TraceRay cualquier número de veces. Pero si alcanzan o superan la profundidad máxima de recursividad, la llamada a TraceRay coloca el dispositivo en estado eliminado. Por lo tanto, los sombreadores raytracing deben tener cuidado para dejar de llamar a TraceRay si han cumplido o superado la profundidad máxima de recursividad.

TriangleHitGroup

TriangleHitGroup corresponde a una estructura de D3D12_HIT_GROUP_DESC cuyo campo Type está establecido en D3D12_HIT_GROUP_TYPE_TRIANGLES.

Este subobjeto se declara con la sintaxis

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
Artículo Descripción
nombre de
Cadena ASCII que identifica de forma única el nombre de la variable.
AnyHitShader
Nombre de cadena del sombreador anyhit para el grupo de aciertos o una cadena vacía.
ClosestHitShader
Nombre de cadena del sombreador de posicionamiento más cercano para el grupo de aciertos o una cadena vacía.

Ejemplo:

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

Tenga en cuenta que ambos campos usan nombres de exportados. Un nombre exportado puede ser diferente del nombre original en HLSL, si la aplicación decide realizar el cambio de nombre de exportación.

ProceduralPrimitiveHitGroup

Un elemento ProceduralPrimitiveHitGroup corresponde a una estructura de D3D12_HIT_GROUP_DESC cuyo campo Type está establecido en D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE.

Este subobjeto se declara con la sintaxis

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
Artículo Descripción
nombre de
Cadena ASCII que identifica de forma única el nombre de la variable.
AnyHitShader
Nombre de cadena del sombreador anyhit para el grupo de aciertos o una cadena vacía.
ClosestHitShader
Nombre de cadena del sombreador de posicionamiento más cercano para el grupo de aciertos o una cadena vacía.
intersecciónShader
Nombre de cadena del sombreador de intersección para el grupo de aciertos o una cadena vacía.

Ejemplo:

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

Tenga en cuenta que los tres campos usan nombres de exportados. Un nombre exportado puede ser diferente del nombre original en HLSL, si la aplicación decide realizar el cambio de nombre de exportación.

Observaciones

Los subobjetos tienen la noción de "asociación" o "qué subobjeto va con qué exportación".

Al especificar subobjetos a través del código de sombreador, la elección de "qué subobjeto va con el que se exporta" sigue las reglas, tal como se describe en la especificación DE DXR . En concreto, supongamos que una aplicación tiene alguna exportación. Si una aplicación asocia esa exportación con la firma raíz A a través del código de sombreador y la firma raíz B a través del código de aplicación, B es la que se usa. El diseño de "usar B" en lugar de "producir un error" ofrece a las aplicaciones la capacidad de invalidar convenientemente las asociaciones DXIL mediante código de aplicación, en lugar de forzarse a volver a compilar sombreadores para resolver errores de coincidencia.

entrada de blog para desarrolladores de DirectX "New in D3D12 – DirectX Raytracing (DXR) now supports library subobjects" (Novedades de D3D12 : DirectX Raytracing (DXR) ahora admite subobjetos de biblioteca"

especificación funcional de DirectX Raytracing (DXR)

Ejemplo: D3D12RaytracingLibrarySubobjects