Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 de
- globalRootSignature
- LocalRootSignature
- SubobjectToExportsAssocation
- RaytracingShaderConfig
- RaytracingPipelineConfig
- TriangleHitGroup
- ProceduralPrimitiveHitGroup
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.