Como projetar um sombreador hull

Um sombreador de casco é o primeiro de três estágios que trabalham juntos para implementar o mosaico (os outros dois estágios são o mosaico e um sombreador de domínio). Este tópico mostra como criar um sombreador de casco.

Um sombreador de casco requer duas funções, o sombreador main casco e uma função constante de patch. O sombreador de casco implementa cálculos em cada ponto de controle; o sombreador de casco também chama a função constante de patch que implementa cálculos em cada patch.

Depois de projetar um sombreador de casco, consulte How To: Create a Hull Shader (Como criar um sombreador hull ) para saber como criar um sombreador de casco.

Para projetar um sombreador de casco

  1. Defina o controle de entrada do sombreador de casco e os pontos de controle de saída.

    // Input control point
    struct VS_CONTROL_POINT_OUTPUT
    {
        float3 vPosition : WORLDPOS;
        float2 vUV       : TEXCOORD0;
        float3 vTangent  : TANGENT;
    };
    
    // Output control point
    struct BEZIER_CONTROL_POINT
    {
        float3 vPosition    : BEZIERPOS;
    };
    
  2. Definir dados constantes de patch de saída.

    // Output patch constant data.
    struct HS_CONSTANT_DATA_OUTPUT
    {
        float Edges[4]        : SV_TessFactor;
        float Inside[2]       : SV_InsideTessFactor;
    
        float3 vTangent[4]    : TANGENT;
        float2 vUV[4]         : TEXCOORD;
        float3 vTanUCorner[4] : TANUCORNER;
        float3 vTanVCorner[4] : TANVCORNER;
        float4 vCWts          : TANWEIGHTS;
    };
    

    Para um domínio quad, SV_TessFactor define quatro fatores de mosaico de borda (para mosaico das bordas), uma vez que o mosaico de função fixa precisa saber quanto para mosaico. As saídas necessárias são diferentes para os domínios de triângulo e isoline.

    O mosaico de função fixa não analisa nenhuma outra saída de sombreador de casco, como outros dados constantes de patch ou qualquer um dos pontos de controle. O sombreador de domínio , que é invocado para cada ponto que o mosaico de função fixa gera , verá como sua entrada todos os pontos de controle de saída do sombreador de casco e todos os dados constantes de patch de saída; o sombreador avalia o patch em sua localização.

  3. Defina uma função de constante de patch. Uma função constante de patch é executada uma vez para cada patch para calcular todos os dados que são constantes para todo o patch (em vez de dados por ponto de controle, que são calculados no sombreador de casco).

    
    #define MAX_POINTS 32
    
    // Patch Constant Function
    HS_CONSTANT_DATA_OUTPUT SubDToBezierConstantsHS( 
        InputPatch<VS_CONTROL_POINT_OUTPUT, MAX_POINTS> ip,
        uint PatchID : SV_PrimitiveID )
    {   
        HS_CONSTANT_DATA_OUTPUT Output;
    
        // Insert code to compute Output here
    
        return Output;
    }
    

    As propriedades da função constante de patch incluem:

    • Uma entrada especifica uma variável que contém uma ID de patch e é identificada pelo valor do sistema SV_PrimitiveID (consulte semântica no modelo de sombreador 4).
    • Um parâmetro de entrada são os pontos de controle de entrada, declarados em VS_CONTROL_POINT_OUTPUT neste exemplo. Uma função de patch pode ver todos os pontos de controle de entrada para cada patch, há 32 pontos de controle por patch neste exemplo.
    • No mínimo, a função deve calcular fatores de mosaico por patch para o estágio do mosaico identificado com SV_TessFactor. Um domínio quad requer quatro fatores de mosaico para as bordas e dois fatores adicionais (identificados por SV_InsideTessFactor) para mosaico dentro do patch. O mosaico de função fixa não analisa nenhuma outra saída de sombreador de casco (como os dados constantes de patch ou qualquer um dos pontos de controle).
    • As saídas geralmente são definidas por uma estrutura e são identificadas por HS_CONSTANT_DATA_OUTPUT neste exemplo; a estrutura depende do tipo de domínio e seria diferente para domínios de triângulo ou isoline.

    Um sombreador de domínio, por outro lado, é invocado para cada ponto que o mosaico de função fixa gera e precisa ver os pontos de controle de saída e os dados constantes de patch de saída (ambos do sombreador de casco) para avaliar um patch em seu local.

  4. Defina um sombreador de casco. Um sombreador de casco identifica as propriedades de um patch, incluindo uma função constante de patch. Um sombreador de casco é invocado uma vez para cada ponto de controle de saída.

    [domain("quad")]
    [partitioning("integer")]
    [outputtopology("triangle_cw")]
    [outputcontrolpoints(16)]
    [patchconstantfunc("SubDToBezierConstantsHS")]
    BEZIER_CONTROL_POINT SubDToBezierHS( 
        InputPatch<VS_CONTROL_POINT_OUTPUT, MAX_POINTS> ip, 
        uint i : SV_OutputControlPointID,
        uint PatchID : SV_PrimitiveID )
    {
        VS_CONTROL_POINT_OUTPUT Output;
    
        // Insert code to compute Output here.
    
        return Output;
    }
    

    Um sombreador hull usa os seguintes atributos:

Todos os pontos de controle de entrada (identificados por VS_CONTROL_POINT_OUTPUT) são visíveis para cada invocação de sombreador de casco. Neste exemplo, há 32 pontos de controle de entrada.

Um sombreador de casco é invocado uma vez por ponto de controle de saída (identificado com SV_OutputControlPointID) para cada patch (identificado com SV_PrimitiveID). A finalidade desse sombreador específico é calcular a saída i, que foi definida como um ponto de controle BEZIER (este exemplo tem 16 pontos de controle de saída definidos por outputcontrolpoints).

Um sombreador de casco executa uma rotina uma vez por patch (a função constante de patch) para calcular dados constantes de patch (fatores de mosaico como mínimo). Separadamente, um sombreador hull executa uma função constante de patch (chamada SubDToBezierConstantsHS) em cada patch para calcular dados constantes de patch, como fatores de mosaico para o estágio do mosaico.

Como usar o Direct3D 11

Visão geral do mosaico