Usando valores gerados pelo sistema

Os valores gerados pelo sistema são gerados pelo estágio IA (com base na semântica de entrada fornecida pelo usuário) para permitir determinadas eficiências em operações de sombreador.

Ao anexar dados, como uma ID de instância (visível ao VS), uma ID de vértice (visível ao VS) ou uma ID primitiva (visível ao GS/PS), um estágio de sombreador subsequente pode procurar esses valores do sistema para otimizar o processamento nesse estágio. Por exemplo, o estágio VS pode procurar a ID da instância para obter dados adicionais por vértice para o sombreador ou para executar outras operações; os estágios GS e PS podem usar a ID primitiva para capturar dados por primitivo da mesma maneira.

Observação

Esses valores gerados pelo sistema Direct3D se aplicam a aplicativos independentemente de usarem o modelo de aplicativo Win32 ou UWP.

VertexID

Uma ID de vértice é usada por cada estágio de sombreador para identificar cada vértice. É um inteiro sem sinal de 32 bits cujo valor padrão é 0. Ele é atribuído a um vértice quando o primitivo é processado pelo estágio IA. Anexe a semântica vertex-id à declaração de entrada do shader para que o estágio de IA gere um identificador por vértice.

A IA adicionará um identificador de vértice a cada vértice para uso nos estágios de sombreamento. Para cada chamada de desenho, a ID do vértice é incrementada em 1. Entre as chamadas de desenho indexadas, a contagem é redefinida de volta para o valor inicial. Para ID3D11DeviceContext::DrawIndexed e ID3D11DeviceContext::DrawIndexedInstanced, o identificador do vértice representa o valor do índice. Se o id do vértice transbordar (exceder 2³²–1), ele volta para 0.

Para todos os tipos primitivos, os vértices têm uma ID de vértice associada a eles (independentemente da adjacência).

PrimitiveID

Uma ID primitiva é usada por cada estágio de sombreador para identificar cada primitivo. É um inteiro sem sinal de 32 bits cujo valor padrão é 0. Ele é atribuído a um primitivo quando o primitivo é processado pelo estágio IA. Para informar ao estágio IA que ele deve gerar um ID de primitiva, anexe a semântica primitive-id à declaração de entrada no shader.

O estágio IA adicionará uma ID de primitivo a cada primitivo para ser usada pelo sombreador de geometria ou pelo estágio do sombreador de pixel (o que estiver ativo primeiro após o estágio IA). Para cada chamada de desenho indexada, a ID primitiva é incrementada em 1, no entanto, a ID primitiva é redefinida para 0 sempre que uma nova instância começa. Todas as outras chamadas de desenho não alteram o valor da ID de instância. Se a ID de instância estourar (exceder 2³² – 1), ela volta para 0.

O estágio do sombreador de pixel não tem uma entrada separada para uma ID primitiva; no entanto, qualquer entrada de sombreador de pixel que especifica uma ID primitiva usa um modo de interpolação constante.

Não há suporte para gerar automaticamente uma ID primitiva para primitivos adjacentes. Para tipos primitivos com adjacência, como uma faixa de triângulo com adjacência, uma ID primitiva é mantida apenas para os primitivos interiores (os primitivos não adjacentes), assim como o conjunto de primitivos em uma faixa de triângulo sem adjacência.

ID de Instância

Uma ID de instância é usada por cada estágio de sombreador para identificar a instância da geometria que está sendo processada no momento. É um inteiro sem sinal de 32 bits cujo valor padrão é 0.

O estágio IA adicionará um identificador da instância a cada vértice se a declaração de entrada do shader de vértice contiver a semântica de identificador da instância. Para cada chamada de desenho indexada, a ID da instância é incrementada em 1. Todas as outras chamadas de desenho não alteram o valor do identificador da instância. Se o identificador da instância sofrer overflow (exceder 2³² − 1), ele retorna a 0.

Exemplo

A ilustração a seguir mostra como os valores do sistema são associados a uma faixa de triângulos instanciada no estágio IA.

ilustração de valores do sistema para uma faixa de triângulos instanciada

Essas tabelas mostram os valores do sistema gerados para ambas as instâncias da mesma faixa de triângulo. A primeira instância (instância U) é mostrada em azul, a segunda instância (instância V) é mostrada em verde. As linhas sólidas conectam os vértices nos primitivos, as linhas tracejadas conectam os vértices adjacentes.

As tabelas a seguir mostram os valores gerados pelo sistema para a instância U.

Dados de vértice C,U D,U E,U F,U G,U H,U I, U J,U K,U L,U
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 0 0 0 0 0 0 0 0 0 0

 

Valor Valor Valor
PrimitiveID 0 1 2
InstanceID 0 0 0

 

As tabelas a seguir mostram os valores gerados pelo sistema para a instância V.

Dados de vértice C,V D,V E,V F,V G,V H,V I,V J,V K,V L,V
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 1 1 1 1 1 1 1 1 1 1

 

Valor Valor Valor
PrimitiveID 0 1 2
InstanceID 1 1 1

 

O montador de entrada gera os identificadores (de vértice, primitiva e instância); observe também que cada instância recebe um identificador de instância exclusivo. Os dados terminam com o corte da faixa, que separa cada instância da faixa de triângulos.

Estágio do Input Assembler