Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Com os modelos de sombreador 6.3 e posteriores, os aplicativos têm a conveniência e a flexibilidade de poder definir objetos de estado DXR diretamente no código de sombreador HLSL, além de usar APIs do Direct3D 12.
Em HLSL, os objetos de estado são declarados com esta sintaxe:
Type Name =
{
Field1,
Field2,
...
};
| Número | Descrição |
|---|---|
|
Tipo |
Identifica o tipo de subobjeto. Deve ser um dos tipos de subobjeto HLSL suportados. |
|
Nome |
Uma cadeia de caracteres ASCII que identifica exclusivamente o nome da variável. |
|
Campo[1, 2, ...] |
Campos do subobjeto. Os campos específicos para cada tipo de subobjeto são descritos abaixo. |
Lista de tipos de subobjeto:
- StateObjectConfig
- GlobalRootSignature
- LocalRootSignature
- SubobjectToExportsAssocation
- RaytracingShaderConfig
- RaytracingPipelineConfig
- TriangleHitGroup
- ProceduralPrimitiveHitGroup
StateObjectConfig
O tipo de subobjeto StateObjectConfig corresponde a uma estrutura D3D12_STATE_OBJECT_CONFIG.
Tem um campo, uma bandeira bitwise, que é um ou ambos os
- STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
- STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS
ou, zero para nenhum deles.
Exemplo:
StateObjectConfig MyStateObjectConfig =
{
STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};
GlobalRootSignature
Um GlobalRootSignature corresponde a uma estrutura D3D12_GLOBAL_ROOT_SIGNATURE.
Os campos consistem em algum número de cadeias de caracteres que descrevem as partes da assinatura raiz. Para obter referência sobre isso, consulte Especificando assinaturas raiz no HLSL.
Exemplo:
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
Um LocalRootSignature corresponde a uma estrutura D3D12_LOCAL_ROOT_SIGNATURE.
Assim como o subobjeto de assinatura raiz global, os campos consistem em algum número de cadeias de caracteres que descrevem as partes da assinatura raiz. Para obter referência sobre isso, consulte Especificando assinaturas raiz no HLSL.
Exemplo:
LocalRootSignature MyLocalRootSignature =
{
"RootConstants(num32BitConstants = 4, b1)" // Cube constants
};
SubobjectToExportsAssocation
Por padrão, um subobjeto meramente declarado na mesma biblioteca que uma exportação pode ser aplicado a essa exportação. No entanto, os aplicativos têm a capacidade de substituir isso e obter informações específicas sobre qual subobjeto acompanha qual exportação. No HLSL, essa "associação explícita" é feita usando SubobjectToExportsAssocation.
Um SubobjectToExportsAssocation corresponde a uma estrutura D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION .
Este subobjeto é declarado com a sintaxe
SubobjectToExportsAssocation Name =
{
SubobjectName,
Exports
};
| Número | Descrição |
|---|---|
|
Nome |
Uma cadeia de caracteres ASCII que identifica exclusivamente o nome da variável. |
|
SubobjectName |
String que identifica um subobjeto exportado. |
|
Exportações |
String que contém uma lista delimitada por ponto-e-vírgula de exportações. |
Exemplo:
SubobjectToExportsAssociation MyLocalRootSignatureAssociation =
{
"MyLocalRootSignature", // Subobject name
"MyHitGroup;MyMissShader" // Exports association
};
Observe que ambos os campos usam exportados nomes. Um nome exportado pode ser diferente do nome original em HLSL, se o aplicativo optar por fazer exportação-renomeação.
RaytracingShaderConfig
Um RaytracingShaderConfig corresponde a uma estrutura D3D12_RAYTRACING_SHADER_CONFIG.
Este subobjeto é declarado com a sintaxe
RaytracingShaderConfig Name =
{
MaxPayloadSize,
MaxAttributeSize
};
| Número | Descrição |
|---|---|
|
Nome |
Uma cadeia de caracteres ASCII que identifica exclusivamente o nome da variável. |
|
MaxPayloadSize |
Valor numérico para o armazenamento máximo para escalares (contados como 4 bytes cada) em cargas úteis de raio para sombreadores de raytracing associados. |
|
MaxAttributeSize |
Valor numérico para o número máximo de escalares (contados como 4 bytes cada) que podem ser usados para atributos em sombreadores de raytracing associados. O valor não pode exceder D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTES. |
Exemplo:
RaytracingShaderConfig MyShaderConfig =
{
16, // Max payload size
8 // Max attribute size
};
RaytracingPipelineConfig
Um RaytracingPipelineConfig corresponde a uma estrutura D3D12_RAYTRACING_PIPELINE_CONFIG.
Este subobjeto é declarado com a sintaxe
RaytracingPipelineConfig Name =
{
MaxTraceRecursionDepth
};
| Número | Descrição |
|---|---|
|
Nome |
Uma cadeia de caracteres ASCII que identifica exclusivamente o nome da variável. |
|
MaxTraceRecursionDepth |
Limite numérico a utilizar para recursão de raios na conduta de raytracing. É um número entre 0 e 31, inclusive. |
Exemplo:
RaytracingPipelineConfig MyPipelineConfig =
{
1 // Max trace recursion depth
};
Como há um custo de desempenho para a recursão de raytracing, os aplicativos devem usar a menor profundidade de recursão necessária para os resultados desejados.
Se as invocações de sombreador ainda não tiverem atingido a profundidade máxima de recursão, elas poderão chamar TraceRay qualquer número de vezes. Mas se eles atingirem ou excederem a profundidade máxima de recursão, chamar TraceRay coloca o dispositivo em estado removido. Portanto, os sombreadores de raytracing devem ter o cuidado de parar de chamar o TraceRay se tiverem atingido ou excedido a profundidade máxima de recursão.
TriangleHitGroup
Um TriangleHitGroup corresponde a uma estrutura D3D12_HIT_GROUP_DESC cujo campo Type está definido como D3D12_HIT_GROUP_TYPE_TRIANGLES.
Este subobjeto é declarado com a sintaxe
TriangleHitGroup Name =
{
AnyHitShader,
ClosestHitShader
};
| Número | Descrição |
|---|---|
|
Nome |
Uma cadeia de caracteres ASCII que identifica exclusivamente o nome da variável. |
|
AnyHitShader |
Nome da cadeia de caracteres do sombreador anyhit para o grupo de visitas ou uma cadeia de caracteres vazia. |
|
ClosestHitShader |
Nome da cadeia de caracteres do sombreador de ocorrências mais próximo para o grupo de ocorrências ou uma cadeia de caracteres vazia. |
Exemplo:
TriangleHitGroup MyHitGroup =
{
"", // AnyHit
"MyClosestHitShader", // ClosestHit
};
Observe que ambos os campos usam exportados nomes. Um nome exportado pode ser diferente do nome original em HLSL, se o aplicativo optar por fazer exportação-renomeação.
ProcessualPrimitiveHitGroup
Um ProceduralPrimitiveHitGroup corresponde a uma estrutura D3D12_HIT_GROUP_DESC cujo campo Type está definido como D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE.
Este subobjeto é declarado com a sintaxe
ProceduralPrimitiveHitGroup Name =
{
AnyHitShader,
ClosestHitShader,
IntersectionShader
};
| Número | Descrição |
|---|---|
|
Nome |
Uma cadeia de caracteres ASCII que identifica exclusivamente o nome da variável. |
|
AnyHitShader |
Nome da cadeia de caracteres do sombreador anyhit para o grupo de visitas ou uma cadeia de caracteres vazia. |
|
ClosestHitShader |
Nome da cadeia de caracteres do sombreador de ocorrências mais próximo para o grupo de ocorrências ou uma cadeia de caracteres vazia. |
|
IntersectionShader |
Nome da cadeia de caracteres do sombreador de interseção para o grupo de visitas ou uma cadeia de caracteres vazia. |
Exemplo:
ProceduralPrimitiveHitGroup MyProceduralHitGroup
{
"MyAnyHit", // AnyHit
"MyClosestHit", // ClosestHit
"MyIntersection" // Intersection
};
Observe que os três campos usam exportados nomes. Um nome exportado pode ser diferente do nome original em HLSL, se o aplicativo optar por fazer exportação-renomeação.
Comentários
Os subobjetos têm a noção de "associação", ou "qual subobjeto acompanha qual exportação".
Ao especificar subobjetos por meio do código de sombreador, a escolha de "qual subobjeto acompanha qual exportação" segue as regras descritas no de especificação DXR do. Em particular, suponha que um aplicativo tenha alguma exportação. Se um aplicativo associa essa exportação à assinatura raiz A por meio do código de sombreador e a assinatura raiz B por meio do código do aplicativo, B é o que é usado. O design de "usar B" em vez de "produzir um erro" dá aos aplicativos a capacidade de substituir convenientemente associações DXIL usando código de aplicativo, em vez de serem forçados a recompilar sombreadores para resolver coisas incompatíveis.