Estágio do Sombreador de Geometria

O estágio GS (sombreador de geometria) executa o código de sombreador especificado pelo aplicativo com vértices como entrada e a capacidade de gerar vértices na saída.

O sombreador geometry

Ao contrário dos sombreadores de vértice, que operam em um único vértice, as entradas do sombreador de geometria são os vértices de um primitivo completo (dois vértices para linhas, três vértices para triângulos ou vértice único para ponto). Sombreadores de geometria também podem trazer os dados de vértice para os primitivos adjacentes à borda como entrada (dois vértices adicionais para uma linha, outros três para um triângulo). A ilustração a seguir mostra um triângulo e uma linha com vértices adjacentes.

ilustração de um triângulo e uma linha com vértices adjacentes

Type
TV Vértice do triângulo
AV Vértice adjacentes
LV Vértice de linha

 

O estágio do sombreador de geometria pode consumir o valor gerado pelo sistema SV_PrimitiveID gerado automaticamente pela IA. Isso permite que os dados por primitivo sejam buscados ou calculados, se desejado.

O estágio de sombreador de geometria é capaz de gerar vários vértices formando uma única topologia selecionada (topologias de saída de estágio GS disponíveis são: tristrip, linestrip e pointlist). O número de primitivos emitidos pode variar livremente dentro de qualquer chamada do sombreador de geometria, embora o número máximo de vértices que podem ser emitidos deva ser declarado estaticamente. Os tamanhos de faixa emitidos a partir de uma chamada de sombreador de geometria podem ser arbitrários, e novas faixas podem ser criadas por meio da função HLSL RestartStrip.

A saída do sombreador de geometria pode ser alimentada no estágio do rasterizador e/ou em um buffer de vértice na memória através do estágio de saída de fluxo. A saída alimentada na memória é expandida em listas de linhas/pontos/triângulos individuais (exatamente da forma como seriam passados para o rasterizador).

Quando um sombreador de geometria está ativo, ele é chamado uma vez para cada primitivo passado para baixo ou gerado anteriormente no pipeline. Cada invocação do sombreador de geometria vê como entrada os dados para a invocação do primitivo, independentemente de ser um único ponto, uma única linha ou um único triângulo. Uma faixa de triângulos de versões anteriores no pipeline resultaria em uma chamada de sombreador de geometria de cada triângulo individual na faixa (como se a faixa fosse expandida em uma lista de triângulos). Todos os dados de entrada para cada vértice no primitivo individual estão disponíveis (ou seja, 3 vértices para triângulo), além de dados de vértice adjacentes, se aplicável/disponíveis.

Um sombreador de geometria produz um vértice de dados por vez, acrescentando vértices a um objeto de fluxo de saída. A topologia dos fluxos é determinada por uma declaração fixa, escolhendo uma de: PointStream, LineStream ou TriangleStream como a saída para o estágio GS. Há três tipos de objetos de fluxo disponíveis, PointStream, LineStream e TriangleStream que são todos objetos modelo. A topologia da saída é determinada pelo seu tipo de objeto correspondente, enquanto o formato dos vértices acrescentado ao fluxo é determinado pelo tipo de modelo. A execução de uma instância do sombreador de geometria é atômica das outras chamadas, exceto pelo fato dos dados adicionados aos fluxos serem seriais. As saídas de uma determinada chamada de um sombreador de geometria são independentes de outras chamadas (porém a ordem é respeitada). Um sombreador de geometria gerando faixas de triângulos iniciará uma faixa tira em cada chamada.

Quando uma saída de sombreador de geometria é identificada como um Valor Interpretado pelo Sistema (por exemplo, SV_RenderTargetArrayIndex ou SV_Position), o hardware examina esses dados e executa algum comportamento dependente do valor, além de ser capaz de passar os dados para o próximo estágio de sombreador para entrada. Quando essa saída de dados do sombreador de geometria tem significado para o hardware por primitivo (como SV_RenderTargetArrayIndex ou SV_ViewportArrayIndex), em vez de em uma base por vértice (como SV_ClipDistance[n] ou SV_Position), os dados por primitivo são obtidos do vértice principal emitido para o primitivo.

Os primitivos parcialmente concluídos podem ser gerados pelo sombreador de geometria, se o sombreador de geometria terminar e o primitivo estiver incompleto. Primitivos incompletos são descartados silenciosamente. Isso é semelhante à maneira como o IA trata primitivos parcialmente concluídas.

O sombreador de geometria pode executar operações de amostragem de textura e carregamento onde não há necessidade de elementos derivados do espaço da tela (samplelevel, samplecmplevelzero, samplegrad).

Os algoritmos que podem ser implementados no sombreador de geometria incluem:

  • Expansão de sprites de ponto
  • Sistemas de partículas dinâmicas
  • Geração de pele/barbatana
  • Geração de volume de sombra
  • Única passagem de renderização para Cubemap
  • Troca de material por primitivo
  • Per-Primitive Configuração de Material – incluindo a geração de coordenadas barycentricas como dados primitivos para que um sombreador de pixel possa executar a interpolação de atributo personalizada (para obter um exemplo de interpolação normal de ordem superior, consulte Exemplo de CubeMapGS).

Pipeline de Gráficos

Estágios de pipeline (Direct3D 10)