Como criar um sombreador de domínio
Um sombreador de domínio é o terceiro de três estágios que trabalham juntos para implementar o mosaico. O sombreador de domínio gera a geometria da superfície dos pontos de controle transformados de um sombreador de casco e das coordenadas UV. Este tópico mostra como criar um sombreador de domínio.
Um sombreador de domínio é invocado uma vez para cada ponto gerado pelo mosaico de função fixa. As entradas são as coordenadas UV[W] do ponto no patch, bem como todos os dados de saída do sombreador de casco, incluindo pontos de controle e constantes de patch. A saída é um vértice definido da maneira desejada. Se a saída estiver sendo enviada para o sombreador de pixel, a saída deverá incluir uma posição (indicada com um SV_Position semântica).
Para criar um sombreador de domínio
Defina o atributo de domínio.
[domain("quad")]
O domínio é definido para um patch quad.
Declare o local no casco com o valor do sistema de localização do domínio .
- Para um patch quad, use um float2.
- Para um patch tri, use um float3 (para coordenadas barycentricas)
- Para uma isoline, use um float2.
Portanto, o local de domínio para um patch quádruplo tem esta aparência:
float2 UV : SV_DomainLocation
Defina as outras entradas.
As outras entradas vêm do sombreador hull e são definidas pelo usuário. Isso inclui os pontos de controle de entrada para patch, dos quais pode haver entre 1 e 32 pontos, e dados constantes de patch de entrada.
Os pontos de controle são definidos pelo usuário, geralmente com uma estrutura como esta (definida em How To: Design a Hull Shader):
const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
Os dados constantes de patch também são definidos pelo usuário e podem ter esta aparência (definida em Como criar um sombreador hull):
HS_CONSTANT_DATA_OUTPUT input
Adicionar código definido pelo usuário para calcular as saídas; isso compõe o corpo do sombreador de domínio.
Essa estrutura contém saídas de sombreador de domínio definidas pelo usuário.
struct DS_OUTPUT { float3 vNormal : NORMAL; float2 vUV : TEXCOORD; float3 vTangent : TANGENT; float3 vBiTangent : BITANGENT; float4 vPosition : SV_POSITION; };
A função usa cada UV de entrada (do mosaico) e avalia o patch de Bézier nessa posição.
[domain("quad")] DS_OUTPUT BezierEvalDS( HS_CONSTANT_DATA_OUTPUT input, float2 UV : SV_DomainLocation, const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch ) { DS_OUTPUT Output; // Insert code to compute the output here. return Output; }
A função é invocada uma vez para cada ponto gerado pelo mosaico de função fixa. Como este exemplo usa um patch quad, o local do domínio de entrada (SV_DomainLocation) é um UV (float2); um patch tri teria um local de entrada float3 (coordenadas baríricas UVW) e uma isoline teria um local de domínio de entrada float2.
As outras entradas para a função vêm diretamente do sombreador de casco. Neste exemplo, são 16 pontos de controle cada um sendo um BEZIER_CONTROL_POINT, bem como dados constantes de patch (HS_CONSTANT_DATA_OUTPUT). A saída é um vértice que contém todos os dados desejados – DS_OUTPUT neste exemplo.
Depois de criar um sombreador de domínio, consulte Como criar um sombreador de domínio.
Tópicos relacionados