Estágios de mosaico
O runtime do Direct3D 11 dá suporte a três novos estágios que implementam o mosaico, que converte superfícies de subdivisão com poucos detalhes em primitivos de detalhes mais altos na GPU. Blocos de mosaico (ou quebras) superfícies de alta ordem em estruturas adequadas para renderização.
Ao implementar o mosaico em hardware, um pipeline de gráficos pode avaliar modelos de detalhes inferiores (contagem de polígonos inferior) e renderizar em detalhes mais altos. Embora o mosaico de software possa ser feito, o mosaico implementado pelo hardware pode gerar uma quantidade incrível de detalhes visuais (incluindo suporte para mapeamento de deslocamento) sem adicionar os detalhes visuais aos tamanhos do modelo e paralisar as taxas de atualização.
- de Benefícios de Mosaico
-
novos estágios de pipeline
- de estágio deHull-Shader
- de estágio do Tessellator
- de estágio deDomain-Shader
- APIs para inicializar os estágios de mosaico
- Como:
- tópicos relacionados
Benefícios de mosaico
Mosaico:
- Salva muita memória e largura de banda, o que permite que um aplicativo renderize superfícies detalhadas mais altas de modelos de baixa resolução. A técnica de mosaico implementada no pipeline do Direct3D 11 também dá suporte ao mapeamento de deslocamento, que pode produzir quantidades impressionantes de detalhes da superfície.
- Dá suporte a técnicas de renderização escalonável, como níveis de detalhes contínuos ou dependentes, que podem ser calculados em tempo real.
- Melhora o desempenho executando cálculos caros em menor frequência (fazendo cálculos em um modelo de detalhes mais baixos). Isso pode incluir cálculos de mesclagem usando formas de mistura ou destinos de transformação para cálculos realistas de animação ou física para detecção de colisão ou dinâmica do corpo suave.
O pipeline do Direct3D 11 implementa o mosaico no hardware, que descompõe o trabalho da CPU para a GPU. Isso poderá levar a melhorias de desempenho muito grandes se um aplicativo implementar um grande número de destinos de transformação e/ou modelos de deformação/esfolação mais sofisticados. Para acessar os novos recursos de mosaico, você deve aprender sobre alguns novos estágios de pipeline.
Novos estágios de pipeline
O Tessellation usa a GPU para calcular uma superfície mais detalhada de uma superfície construída a partir de patches quad, patches de triângulo ou isólinas. Para aproximar a superfície de alta ordem, cada patch é subdividido em triângulos, pontos ou linhas usando fatores de mosaico. O pipeline do Direct3D 11 implementa o mosaico 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 (quad, triângulo ou linha).
- de estágio do Tessellator – 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 esses exemplos.
- Domain-Shader Estágio – um estágio de sombreador programável que calcula a posição do vértice que corresponde a cada exemplo de domínio.
O diagrama a seguir realça os novos estágios do pipeline do Direct3D 11.
O diagrama a seguir mostra a progressão por meio dos estágios de mosaico. A progressão começa com a superfície de subdivisão com poucos detalhes. A progressão em seguida realça o patch de entrada com o patch de geometria correspondente, exemplos de domínio e triângulos que conectam esses exemplos. A progressão finalmente realça os vértices que correspondem a esses exemplos.
Estágio Hull-Shader
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 mosaico e o estágio de domínio. No nível mais simples da caixa preta, o estágio de sombreador de casco se pareceria com o diagrama a seguir.
de estágio do sombreador de casco
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 mosaico. 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 de patch podem ser consumidos por um sombreador de domínio; Os fatores de mosaico podem ser consumidos pelo sombreador de domínio e pelo estágio de mosaico.
- Os fatores de mosaico determinam quanto subdividir cada patch.
- O sombreador declara o estado exigido pelo estágio do mosaico. 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 ao mosaico. Essas informações aparecem como declarações normalmente na frente do código do sombreador.
- Se o estágio de sombreador de casco definir qualquer fator de mosaico de borda como = 0 ou NaN, o patch será eliminado. Como resultado, o estágio do mosaico 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 realmente 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 um código de byte que conduz o hardware.
- A fase do ponto de controle opera uma vez para cada ponto de controle, lendo os pontos de controle de um patch e gerando um ponto de controle de saída (identificado por um ControlPointID).
- A fase de constante de patch opera uma vez por patch para gerar fatores de mosaico de borda e outras constantes por patch. Internamente, muitas fases de constante de patch podem ser executadas ao mesmo tempo. A fase de 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 How To: Create a Hull Shader.
Estágio do Mosaico
O mosaico é um estágio de função fixa inicializado associando um sombreador de casco ao pipeline (consulte How To: Initialize the Tessellator Stage). A finalidade do estágio do mosaico é subdividir um domínio (quad, tri ou linha) em muitos objetos menores (triângulos, pontos ou linhas). O mosaico coloca um domínio canônico em um sistema de coordenadas normalizado (zero a um). Por exemplo, um domínio quad é mosaicado para um quadrado de unidade.
O mosaico opera uma vez por patch usando os fatores de mosaico (que especificam o quão finamente o domínio será mosaicado) e o tipo de particionamento (que especifica o algoritmo usado para dividir um patch) que são passados do estágio do sombreador de casco. O mosaico gera coordenadas uv (e opcionalmente w) e a topologia de superfície para o estágio de sombreador de domínio.
Internamente, o mosaico opera em duas fases:
- A primeira fase processa os fatores de mosaico, corrigindo problemas de arredondamento, tratando fatores muito pequenos, reduzindo e combinando fatores, usando aritmética de ponto flutuante de 32 bits.
- A segunda fase gera listas de ponto ou topologia com base no tipo de particionamento selecionado. Essa é a tarefa principal do estágio do mosaico e usa frações de 16 bits com aritmética de ponto fixo. A aritmética de ponto fixo permite aceleração de hardware, mantendo a 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 | Intervalo TessFactor: [2..64] |
inteiro | Intervalo TessFactor: [1..64] |
pow2 | Intervalo TessFactor: [1..64] |
Estágio Domain-Shader
Um sombreador de domínio calcula a posição do 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 mosaico e tem acesso somente leitura às coordenadas UV de saída do estágio do mosaico, ao patch de saída do sombreador do casco e às constantes de 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 do mosaico.
- Um sombreador de domínio consome pontos de controle de saída do estágio de sombreador de casco.
- Um sombreador de domínio gera a posição de um vértice.
- As entradas são as saídas do sombreador de casco, incluindo pontos de controle, dados constantes de patch e fatores de mosaico. Os fatores de mosaico podem incluir os valores usados pelo mosaico de função fixa, bem como os valores brutos (antes de arredondar por mosaico inteiro, por exemplo), o que facilita a geomorfórfa, por exemplo.
Depois que o sombreador de domínio for concluído, o mosaico será concluído e os dados de pipeline continuarão para o próximo estágio de 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 o mosaico está ativo (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 mosaico
O Tessellation é implementado com dois novos estágios de sombreador programáveis: 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 destinos do 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 runtime quando sombreadores são associados ao pipeline usando APIs como DSSetShader e HSSetShader. Mas primeiro, o sombreador deve ser criado usando APIs como CreateHullShader e CreateDomainShader.
Habilite o mosaico criando um sombreador de casco e associando-o ao estágio de sombreador de casco (isso configura automaticamente o estágio do mosaico). Para gerar as posições de vértice final dos patches com mosaico, você também precisará criar um sombreador de domínio e associá-lo ao estágio de sombreador de domínio. Depois que o mosaico estiver habilitado, a entrada de dados no estágio do assembler de entrada deve ser dados de patch. Ou seja, a topologia do assembler de entrada deve ser uma topologia de constante de patch de D3D11_PRIMITIVE_TOPOLOGY definida com IASetPrimitiveTopology.
Para desabilitar a mosaico, defina o sombreador do casco e o sombreador de domínio para 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 do sombreador de casco ou dados de patch.
Novas topologias para o estágio de assembler de entrada, que são extensões para essa enumeração.
enum D3D11_PRIMITIVE_TOPOLOGY
A topologia é definida como o estágio de assembler de entrada usando IASetPrimitiveTopology
É claro que os novos estágios de sombreador programáveis exigem que outro estado seja definido, para associar buffers constantes, exemplos e recursos de sombreador aos estágios de pipeline apropriados. Esses novos métodos ID3D11Device são implementados para definir esse estado.
- DSGetConstantBuffers
- DSGetSamplers
- DSGetShader
- DSGetShaderResources
- DSSetConstantBuffers
- DSSetSamplers
- DSSetShader
- DSSetShaderResources
- HSGetConstantBuffers
- HSGetShaderResources
- HSGetSamplers
- HSGetShader
- HSSetConstantBuffers
- HSSetSamplers
- HSSetShader
- HSSetShaderResources
Como:
A documentação também contém exemplos para inicializar os estágios de mosaico.
Item | Descrição |
---|---|
Como criar um sombreador de casco |
Crie um sombreador de casco. |
Como criar um sombreador de casco |
Projete um sombreador de casco. |
Como inicializar o de Estágio do Tessellator |
Inicialize o estágio de mosaico. |
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. |