Objetos de estado

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 direct3D 12.

No HLSL, os objetos de estado são declarados com esta sintaxe:

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
Item Descrição
Tipo
Identifica o tipo de subobjeto. Deve ser um dos tipos de subobjeto HLSL com suporte.
Nome
Uma cadeia de caracteres ASCII que identifica exclusivamente o nome da variável.
Campo[1, 2, ...]
Campos do subobjeto. Campos específicos para cada tipo de subobjeto são descritos abaixo.

Lista de tipos de subobjeto:

StateObjectConfig

O tipo de subobjeto StateObjectConfig corresponde a uma estrutura D3D12_STATE_OBJECT_CONFIG .

Ele tem um campo, um sinalizador bit a bit, que é um ou ambos

  • 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 algumas 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 algumas 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 é capaz de aplicar a essa exportação. No entanto, os aplicativos têm a capacidade de substituir isso e obter detalhes sobre qual subobjeto vai com 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 .

Esse subobjeto é declarado com a sintaxe

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
Item Descrição
Nome
Uma cadeia de caracteres ASCII que identifica exclusivamente o nome da variável.
SubobjectName
Cadeia de caracteres que identifica um subobjeto exportado.
Exportações
Cadeia de caracteres 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 nomes exportados . Um nome exportado poderá ser diferente do nome original em HLSL, se o aplicativo optar por fazer a renomeação de exportação.

RaytracingShaderConfig

Um RaytracingShaderConfig corresponde a uma estrutura D3D12_RAYTRACING_SHADER_CONFIG .

Esse subobjeto é declarado com a sintaxe

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
Item 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 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 .

Esse subobjeto é declarado com a sintaxe

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
Item Descrição
Nome
Uma cadeia de caracteres ASCII que identifica exclusivamente o nome da variável.
MaxTraceRecursionDepth
Limite numérico a ser usado para recursão de raios no pipeline 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 atingirem a profundidade máxima de recursão, elas poderão chamar TraceRay várias vezes. Mas se eles atingirem ou excederem a profundidade máxima de recursão, chamar TraceRay colocará o dispositivo no estado removido. Portanto, os sombreadores de raytracing devem ter o cuidado de parar de chamar 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 Tipo está definido como D3D12_HIT_GROUP_TYPE_TRIANGLES.

Esse subobjeto é declarado com a sintaxe

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
Item 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 ocorrências ou uma cadeia de caracteres vazia.
ClosestHitShader
Nome da cadeia de caracteres do sombreador de clique 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 nomes exportados . Um nome exportado poderá ser diferente do nome original em HLSL, se o aplicativo optar por fazer a renomeação de exportação.

ProceduralPrimitiveHitGroup

Um ProceduralPrimitiveHitGroup corresponde a uma estrutura D3D12_HIT_GROUP_DESC cujo campo Tipo está definido como D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE.

Esse subobjeto é declarado com a sintaxe

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
Item 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 ocorrências ou uma cadeia de caracteres vazia.
ClosestHitShader
Nome da cadeia de caracteres do sombreador de clique 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 ocorrências ou uma cadeia de caracteres vazia.

Exemplo:

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

Observe que os três campos usam nomes exportados . Um nome exportado poderá ser diferente do nome original em HLSL, se o aplicativo optar por fazer a renomeação de exportação.

Comentários

Subobjetos têm a noção de "associação" ou "qual subobjeto vai com qual exportação".

Ao especificar subobjetos por meio do código de sombreador, a escolha de "qual subobjeto vai com qual exportação" segue as regras, conforme descrito na especificação DXR. Em particular, suponha que um aplicativo tenha alguma exportação. Se um aplicativo associar essa exportação à assinatura raiz A por meio do código de sombreador e da assinatura raiz B por meio do código do aplicativo, B será o que será usado. O design de "usar B" em vez de "produzir um erro" dá aos aplicativos a capacidade de substituir convenientemente as associações DXIL usando o código do aplicativo, em vez de serem forçados a recompilar sombreadores para resolve coisas incompatíveis.

Postagem no Blog do Desenvolvedor do DirectX "Novo em D3D12 – O DirectX Raytracing (DXR) agora dá suporte a subobjetos de biblioteca"

Especificação funcional do DXR (DirectX Raytracing)

Exemplo: D3D12RaytracingLibrarySubobjects