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
- GlobalRootSignature
- LocalRootSignature
- SubobjectToExportsAssocation
- RaytracingShaderConfig
- RaytracingPipelineConfig
- TriangleHitGroup
- ProceduralPrimitiveHitGroup
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.