Estágios de tesselação
O tempo de execução do Direct3D 11 suporta três novos estágios que implementam a tesselação, que converte superfícies de subdivisão de baixo detalhe em primitivas de maior detalhe na GPU. Telhas de tesselação (ou quebram) superfícies de alta ordem em estruturas adequadas para renderização.
Ao implementar tesselação em hardware, um pipeline gráfico pode avaliar modelos de menor detalhe (menor contagem de polígonos) e renderizar com mais detalhes. Enquanto a tesselação de software pode ser feita, a tesselação implementada por hardware pode gerar uma quantidade incrível de detalhes visuais (incluindo suporte para mapeamento de deslocamento) sem adicionar o detalhe visual aos tamanhos do modelo e taxas de atualização paralisantes.
- Benefícios da Tessellation
- Novos Estágios de Pipeline
- APIs para inicializar o Tessellation Stages
- Como fazer:
- Tópicos relacionados
Benefícios da Tessellation
Tesselação:
- Economiza muita memória e largura de banda, o que permite que um aplicativo renderize superfícies mais detalhadas de modelos de baixa resolução. A técnica de tesselação implementada no pipeline do Direct3D 11 também suporta mapeamento de deslocamento, que pode produzir quantidades impressionantes de detalhes de superfície.
- Suporta técnicas de renderização escalável, como níveis de detalhe contínuos ou dependentes da visualização, que podem ser calculados em tempo real.
- Melhora o desempenho executando cálculos caros em frequência mais baixa (fazendo cálculos em um modelo de menor detalhe). Isso pode incluir cálculos de mistura usando formas de mistura ou alvos morfológicos para animação realista ou cálculos físicos para deteção de colisão ou dinâmica de corpo mole.
O pipeline do Direct3D 11 implementa tessellation em hardware, que descarrega o trabalho da CPU para a GPU. Isso pode levar a melhorias de desempenho muito grandes se um aplicativo implementar um grande número de alvos morfológicos e/ou modelos mais sofisticados de esfolamento/deformação. Para acessar os novos recursos de tesselação, você deve aprender sobre alguns novos estágios de pipeline.
Novos estágios do pipeline
A tesselação usa a GPU para calcular uma superfície mais detalhada a partir de uma superfície construída a partir de manchas quádruplas, remendos de triângulo ou isolinhas. Para aproximar a superfície de alta ordem, cada patch é subdividido em triângulos, pontos ou linhas usando fatores de tesselação. O pipeline do Direct3D 11 implementa a tesselação usando três novos estágios de pipeline:
- Hull-Shader Estágio - Um estágio de sombreador programável que produz um patch de geometria (e constantes de patch) que correspondem a cada patch de entrada (quadriciclo, triângulo ou linha).
- Tessellator Stage - Um estágio de pipeline de função fixa que cria um padrão de amostragem do domínio que representa o patch de geometria e gera um conjunto de objetos menores (triângulos, pontos ou linhas) que conectam essas amostras.
- Domain-Shader Estágio - Um estágio de sombreador programável que calcula a posição do vértice que corresponde a cada amostra de domínio.
O diagrama a seguir destaca os novos estágios do pipeline do Direct3D 11.
O diagrama a seguir mostra a progressão através dos estágios de tesselação. A progressão começa com a superfície de subdivisão de baixo detalhe. A progressão em seguida destaca o patch de entrada com o patch de geometria correspondente, amostras de domínio e triângulos que conectam essas amostras. A progressão finalmente destaca os vértices que correspondem a essas amostras.
Hull-Shader Palco
Um sombreador de casco - que é invocado uma vez por patch - transforma pontos de controle de entrada que definem uma superfície de baixa ordem em pontos de controle que compõem um patch. Ele também faz alguns cálculos por patch para fornecer dados para o estágio de tesselação e o estágio de domínio. No nível de caixa preta mais simples, o estágio de sombreador de casco seria algo parecido com o diagrama a seguir.
Um sombreador de casco é implementado com uma função HLSL e tem as seguintes propriedades:
- A entrada do sombreador está entre 1 e 32 pontos de controle.
- A saída do sombreador está entre 1 e 32 pontos de controle, independentemente do número de fatores de tesselação. A saída de pontos de controle de um sombreador de casco pode ser consumida pelo estágio de sombreador de domínio. Os dados constantes do patch podem ser consumidos por um sombreador de domínio; Os fatores de tesselação podem ser consumidos pelo sombreador de domínio e pelo estágio de tesselação.
- Os fatores de tesselação determinam quanto subdividir cada patch.
- O sombreador declara o estado exigido pelo estágio tessellator. Isso inclui informações como o número de pontos de controle, o tipo de face do patch e o tipo de particionamento a ser usado durante o teste. Essas informações aparecem como declarações normalmente na frente do código do sombreador.
- Se o estágio de sombreador do casco definir qualquer fator de tesselação de aresta para = 0 ou NaN, o patch será eliminado. Como resultado, o estágio tessellator pode ou não ser executado, o sombreador de domínio não será executado e nenhuma saída visível será produzida para esse patch.
Em um nível mais profundo, um sombreador de casco na verdade opera em duas fases: uma fase de ponto de controle e uma fase de constante de patch, que são executadas em paralelo pelo hardware. O compilador HLSL extrai o paralelismo em um sombreador de casco e o codifica em bytecode que dirige o hardware.
- A fase do ponto de controle opera uma vez para cada ponto de controle, lendo os pontos de controle para um patch e gerando um ponto de controle de saída (identificado por um ControlPointID).
- A fase constante do patch opera uma vez por patch para gerar fatores de tesselação de borda e outras constantes por patch. Internamente, muitas fases constantes de patch podem ser executadas ao mesmo tempo. A fase constante de patch tem acesso somente leitura a todos os pontos de controle de entrada e saída.
Aqui está um exemplo de um sombreador de casco:
[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
InputPatch<MyInPoint, 12> InPts)
{
MyOutPoint result;
...
result = TransformControlPoint( InPts[Id] );
return result;
}
Para obter um exemplo que cria um sombreador de casco, consulte Como criar um sombreador de casco.
Estágio Tessellator
O tessellator é um estágio de função fixa inicializado ligando um sombreador de casco ao pipeline (consulte Como: Inicializar o estágio do tessellator). O objetivo do estágio tessellator é subdividir um domínio (quad, tri ou linha) em muitos objetos menores (triângulos, pontos ou linhas). O tessellator exibe um domínio canônico em um sistema de coordenadas normalizado (zero para um). Por exemplo, um domínio quad é tesselado para um quadrado de unidade.
O tessellator opera uma vez por patch usando os fatores de tesselação (que especificam quão finamente o domínio será tesselado) e o tipo de particionamento (que especifica o algoritmo usado para fatiar um patch) que são passados do estágio de sombreador do casco. O tessellator produz coordenadas uv (e, opcionalmente, w) e a topologia de superfície para o estágio domain-shader.
Internamente, o tessellator opera em duas fases:
- A primeira fase processa os fatores de tesselação, corrigindo problemas de arredondamento, lidando com fatores muito pequenos, reduzindo e combinando fatores, usando aritmética de ponto flutuante de 32 bits.
- A segunda fase gera listas de pontos ou topologias com base no tipo de particionamento selecionado. Esta é a tarefa principal do estágio tessellator e usa frações de 16 bits com aritmética de ponto fixo. A aritmética de ponto fixo permite a aceleração do hardware enquanto mantém uma precisão aceitável. Por exemplo, dado um patch de 64 metros de largura, essa precisão pode colocar pontos em uma resolução de 2 mm.
Tipo de particionamento | Gama |
---|---|
fractional_odd | [1...63] |
fractional_even | Gama TessFactor: [2..64] |
inteiro | Gama TessFactor: [1..64] |
POW2 | Gama TessFactor: [1..64] |
Domain-Shader Palco
Um sombreador de domínio calcula a posição de vértice de um ponto subdividido no patch de saída. Um sombreador de domínio é executado uma vez por ponto de saída do estágio do tesselador e tem acesso somente leitura às coordenadas UV de saída do estágio do tesselator, ao patch de saída do sombreador do casco e às constantes do patch de saída do sombreador do casco, como mostra o diagrama a seguir.
As propriedades do sombreador de domínio incluem:
- Um sombreador de domínio é invocado uma vez por coordenada de saída do estágio tessellator.
- Um sombreador de domínio consome pontos de controle de saída do estágio de sombreador de casco.
- Um sombreador de domínio produz a posição de um vértice.
- As entradas são as saídas do sombreador do casco, incluindo pontos de controle, dados constantes de patch e fatores de tesselação. Os fatores de tesselação podem incluir os valores utilizados pelo tesselador de função fixa, bem como os valores brutos (antes do arredondamento por tesselação inteira, por exemplo), o que facilita a geomorfologia, por exemplo.
Após a conclusão do sombreador de domínio, a tesselação é concluída e os dados do pipeline continuam para o próximo estágio do pipeline (sombreador de geometria, sombreador de pixel, etc.). Um sombreador de geometria que espera primitivos com adjacência (por exemplo, 6 vértices por triângulo) não é válido quando a tesselação está ativa (isso resulta em um comportamento indefinido, do qual a camada de depuração reclamará).
Aqui está um exemplo de um sombreador de domínio:
void main( out MyDSOutput result,
float2 myInputUV : SV_DomainPoint,
MyDSInput DSInputs,
OutputPatch<MyOutPoint, 12> ControlPts,
MyTessFactors tessFactors)
{
...
result.Position = EvaluateSurfaceUV(ControlPoints, myInputUV);
}
APIs para inicializar estágios de tessellação
O Tessellation é implementado com dois novos estágios programáveis de sombreador: um sombreador de casco e um sombreador de domínio. Esses novos estágios de sombreador são programados com código HLSL definido no modelo de sombreador 5. Os novos alvos de sombreador são: hs_5_0 e ds_5_0. Como todos os estágios de sombreador programáveis, o código para o hardware é extraído de sombreadores compilados passados para o tempo de execução quando os sombreadores são vinculados ao pipeline usando APIs como DSSetShader e HSSetShader. Mas primeiro, o sombreador deve ser criado usando APIs como CreateHullShader e CreateDomainShader.
Habilite a tesselação criando um sombreador de casco e vinculando-o ao estágio de sombreador de casco (isso configura automaticamente o estágio de tessellator). Para gerar as posições de vértice finais a partir dos patches tesselados, você também precisará criar um sombreador de domínio e vinculá-lo ao estágio de sombreador de domínio. Uma vez habilitada a tesselação, a entrada de dados para o estágio de montagem de entrada deve ser dados de patch. Ou seja, a topologia do assembler de entrada deve ser uma topologia constante de patch de D3D11_PRIMITIVE_TOPOLOGY definida com IASetPrimitiveTopology.
Para desativar a tesselação, defina o sombreador de casco e o sombreador de domínio como NULL. Nem o estágio de sombreador de geometria nem o estágio de saída de fluxo podem ler pontos de controle de saída de sombreador de casco ou dados de patch.
Novas topologias para o estágio input-assembler, que são extensões dessa enumeração.
enum D3D11_PRIMITIVE_TOPOLOGY
A topologia é definida para o estágio de montagem de entrada usando IASetPrimitiveTopology
É claro que os novos estágios de sombreador programáveis exigem que outro estado seja definido, para vincular buffers constantes, amostras e recursos de sombreador aos estágios de pipeline apropriados. Esses novos métodos ID3D11Device são implementados para definir esse estado.
Como fazer:
A documentação também contém exemplos para inicializar os estágios de tesselação.
Número | Descrição |
---|---|
Como criar um sombreador de casco |
Crie um sombreador de casco. |
Como: Projetar um sombreador de casco |
Projete um sombreador de casco. |
Como: Inicializar o estágio do Tessellator |
Inicialize o estágio de tesselação. |
Como criar um sombreador de domínio |
Crie um sombreador de domínio. |
Como criar um sombreador de domínio |
Crie um sombreador de domínio. |