Compartir a través de


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 código de 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,
    ...
};
Elemento Descripción
Tipo
Identifica el tipo de subobjeto. Debe ser uno de los tipos de subobjetos HLSL admitidos.
Nombre
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 de 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, cero para ninguno de ellos.

Ejemplo:

StateObjectConfig MyStateObjectConfig = 
{ 
    STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};

GlobalRootSignature

GlobalRootSignature corresponde a una estructura de D3D12_GLOBAL_ROOT_SIGNATURE .

Los campos constan de algún número de cadenas que describen las partes de la firma raíz. Para obtener referencia sobre esto, consulte Especificación de 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 de D3D12_LOCAL_ROOT_SIGNATURE .

Al igual que el subobjeto de firma raíz global, los campos constan de algún número de cadenas que describen las partes de la firma raíz. Para obtener referencia sobre esto, consulte Especificación de 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 aplicar 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 qué exportación. En HLSL, esta "asociación explícita" se realiza mediante SubobjectToExportsAssocation.

Una SubobjectToExportsAssocation corresponde a una estructura de D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION .

Este subobjeto se declara con la sintaxis

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
Elemento Descripción
Nombre
Cadena ASCII que identifica de forma única el nombre de la variable.
SubobjectName
Cadena que identifica un subobjeto exportado.
Exportaciones
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 exportados . Un nombre exportado puede ser diferente del nombre original en HLSL, si la aplicación decide cambiar el nombre de la exportación.

RaytracingShaderConfig

Un Objeto RaytracingShaderConfig corresponde a una estructura de D3D12_RAYTRACING_SHADER_CONFIG .

Este subobjeto se declara con la sintaxis

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
Elemento Descripción
Nombre
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 de 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

Un Objeto RaytracingPipelineConfig corresponde a una estructura de D3D12_RAYTRACING_PIPELINE_CONFIG .

Este subobjeto se declara con la sintaxis

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
Elemento Descripción
Nombre
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 incluidos.

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, al llamar a TraceRay se coloca el dispositivo en estado quitado. Por lo tanto, los sombreadores de raytracing deben tener cuidado para dejar de llamar a TraceRay si han cumplido o superado la profundidad máxima de recursividad.

TriangleHitGroup

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

Este subobjeto se declara con la sintaxis

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
Elemento Descripción
Nombre
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 aciertos 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 exportados . Un nombre exportado puede ser diferente del nombre original en HLSL, si la aplicación decide cambiar el nombre de la 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
};
Elemento Descripción
Nombre
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 aciertos más cercano para el grupo de aciertos o una cadena vacía.
IntersectionShader
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 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.

Comentarios

Los subobjetos tienen la noción de "asociación" o "qué subobjeto va con el que se exporta".

Al especificar subobjetos a través del código del sombreador, la elección de "qué subobjeto va con el que se exporta" sigue las reglas tal como se describe en la especificación 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" proporciona 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 "Novedad de D3D12 : DirectX Raytracing (DXR) ahora admite subobjetos de biblioteca"

Especificación funcional de DirectX Raytracing (DXR)

Ejemplo: D3D12RaytracingLibrarySubobjects