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

  1. Defina o atributo de domínio.

    [domain("quad")]
    

    O domínio é definido para um patch quad.

  2. 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
    
  3. 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
    
  4. 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.

Como usar o Direct3D 11

Visão geral do mosaico