Para que são utilizados os sombreadores Hull, Domain e Geometry?

21

Fiz minha parte justa da programação de jogos em 3D para meu (ex) empregador e também em meus próprios mecanismos personalizados para meus próprios jogos independentes.

Inicialmente, comecei com o Direct3D 9 e o D3DX9, que praticamente fizeram tudo por mim e não exigiram que eu pensasse em termos de sombreadores.

Depois disso, escrevi meus primeiros shaders Direct3D 9, mas usei principalmente um shader muito simples para tudo o que fiz.

Na iteração mais recente do meu mecanismo de jogo, mudei para o Direct3D 11 e, com isso, criei muitos shaders. Fiz a skin da GPU, partículas calculadas pela GPU, muitos efeitos de iluminação e pós-processamento, tudo na GPU. Coisas muito legais.

Até agora, usei apenas sombreadores de vértice e pixel / fragmento. Embora ainda haja muitas coisas que ainda não fiz, acredito ter um conhecimento sólido do que os shaders de vértice e pixel / fragmento fazem e como tudo isso se encaixa em todo o pipeline 3D.

Acompanhando desenvolvimentos mais recentes, fiquei muito interessado nos estágios mais novos do shader. Ou seja, o sombreador de geometria e, ainda mais recente, os sombreadores de casco e domínio.

Eu nunca usei esses estágios, mas pelo que sei, o sombreador Geometry, se ativado, é executado após o sombreador de vértice, uma vez para cada vértice transformado (ou uma vez por primitivo?) E permite descartar vértices (e primitivos?) e crie novos (que eu acho que voltam ao início do pipeline?).

Meu palpite é que o principal uso do sombreador de geometria seria gerar programaticamente a geometria na GPU. Um uso comum seria criar quads de outdoor com base em um único vértice, mas eu realmente não visualizo muitos outros cenários comuns além de gerar fractais e outras coisas que você pode gerar 100% programaticamente.

Quanto aos sombreadores Hull e Domain, parece que eles estão relacionados ao mosaico (criando superfícies mais suaves a partir de superfícies ásperas?) E devem ser usados ​​juntos ou não. O termo "patch" também parece ser comum aqui.

Alguém gostaria de me explicar, em termos práticos, para que servem esses estágios de novo shader, como eles se encaixam no pipeline 3D e em quais casos devo considerar usá-los?

Panda Pajama
fonte
Eu acho que você está perguntando da maneira errada - em vez de "para que eles são usados", você deve estar perguntando "o que eles fazem" - se você entende os recursos fornecidos (e seus conceitos subjacentes), apenas o céu limita o que você é realmente capaz de fazer com eles.
Wondra
@wondra: É quase a mesma pergunta, mas eu gostaria de me concentrar mais em exemplos de uso prático, em vez de na explicação teórica do que eles fazem. De fato, há uma visão geral no MSDN que já li muitas vezes, mas ainda não consigo entender o que elas podem fazer por mim. Sou um ser inteligente, e posso conectar A e B, e descobrir C, D, E e F a partir disso.
Panda Pyjama
Não sei, "exemplos práticos de uso" parece um pouco amplo para mim. Dei uma facada nele, mas antes desse comentário, ele pode se concentrar muito em "o que eles fazem" pelo seu.
@ Josh: Você usa ou já usou todos esses estágios no mundo real?
Panda Pajama
1
Um FYI para quem tem um background não diretox (como eu), esses dois são chamados de "shader de controle de mosaico" e "shader de avaliação de mosaico" no OpenGL e no Vulkan.
precisa

Respostas:

13

Casco e domínios

Os estágios do casco e do sombreador de domínio fazem parte do pipeline de mosaico da GPU. Eles geralmente são usados ​​para calcular geometria de superfície altamente detalhada com base na geometria da superfície de entrada com detalhes mais baixos, definida como triângulos ou quads (etc.). As primitivas de entrada com detalhes mais baixos são chamadas de "patches" e é importante observar que elas podem não representar a geometria real que eventualmente existirá (embora possam). Pense mais nos pontos de controle de uma curva de bezier, exceto em uma superfície.

O sombreador do casco pega um patch de entrada e produz um patch de saída (ou patches; é aqui que geralmente ocorre a subdivisão do patch). Os metadados constantes sobre o patch também podem ser computados no shader do casco e gerados para os estágios posteriores do pipeline.

A saída do sombreador do casco passa por um estágio de mosaico (função fixa) que produz domínios normalizados lado a lado do tipo apropriado (por exemplo, quads ou triângulos).

O sombreador de domínio é executado nesses domínios para calcular a posição real do vértice de qualquer ponto especificado em um domínio que resultou do mosaico mencionado acima. O sombreador de domínio gera uma posição de vértice.

A fase de mosaico ocorre após o estágio de vertex shader no pipeline.

Sombra de geometria

Os shaders de geometria são como shaders simplificados de casco / domínio, de certa forma. Eles simplesmente pegam vértices de entrada e produzem vértices de saída. Para um dado vértice de entrada, muitos vértices de saída podem ser produzidos, para que possam ser usados ​​para "gerar geometria".

O estágio de sombreamento de geometria ocorre após o sombreador de vértice e após o estágio de mosaico.

Usos

O sombreador de geometria pode gravar nos buffers de saída do fluxo em vez de ser alimentado diretamente na fase de rasterização e sombreamento de fragmentos do pipeline; isso significa efetivamente que você pode executar novamente a geometria produzida por uma combinação de uma iteração de sombreamento de vértice / casco / domínio / geometria de volta no pipeline, para executar trabalhos adicionais em outro estágio de sombreador de vértice ou qualquer outra coisa.

O que você pode usar para isso é um tópico bastante amplo e efetivamente ilimitado, por isso não tentarei abordar isso. Mas, por alguns motivos motivadores para considerar usá-los ... O principal desses estágios de sombreador é que eles permitem obter muitos detalhes extras sem pagar a memória ou o custo de largura de banda por tudo isso, o tempo todo. E também para mover o processamento da CPU para a GPU.

O terreno é um bom exemplo de onde você pode usar alguma dessa tecnologia, pois geralmente você precisa vê-la muito de perto (como seu personagem está em pé) e muito longe (as montanhas ao longe) e poder controlar onde e quantos detalhes você coloca na geometria do terreno "on the fly" através desses estágios do shader é muito poderoso. Historicamente, as alternativas pagam um custo médio constante para o terreno (uma abordagem de menor denominador comum) ou paginam manualmente pedaços de geometria para diferentes níveis de detalhe dentro e fora da memória da GPU, o que é tedioso e caro.

Qualquer situação semelhante em que você possa ter uma gama realmente ampla de níveis de detalhes necessários para dar suporte a alguma malha ou modelo que também seja razoavelmente subdividível pode ser um candidato a fazer algo inteligente com esses shaders também. Porém, nem tudo traduz bem a otimização do estilo de superfície da subdivisão . Você provavelmente poderia usá-los também para tecidos e cabelos.

Para uma leitura mais aprofundada, incluindo muito mais detalhes do que posso me lembrar ou entrar aqui:


fonte
4
Lembre-se de que os shaders de casco e domínio exigem hardware do Direct3D Level 11.0 ou posterior, e os shaders de geometria exigem hardware do Direct3D Level 10.0 ou posterior. Além disso, a maioria dos designs de placas de vídeo oferece muito pouco ou nenhum hardware dedicado ao estágio de sombreador de geometria, portanto, na prática, sua utilidade é muito menor do que o inicialmente previsto.
Chuck Walbourn
@ChuckWalbourn: Eu realmente gostaria de ouvir mais, se você gostaria, em uma resposta em separado
Panda Pajama