Guide pratique pour concevoir un nuanceur de domaine

Un nuanceur de domaine est la troisième des trois étapes qui fonctionnent ensemble pour implémenter le pavage. Le nuanceur de domaine génère la géométrie de surface à partir des points de contrôle transformés d’un nuanceur de coque et des coordonnées UV. Cette rubrique montre comment concevoir un nuanceur de domaine.

Un nuanceur de domaine est appelé une fois pour chaque point généré par le tessellateur de fonction fixe. Les entrées sont les coordonnées UV[W] du point sur le patch, ainsi que toutes les données de sortie du nuanceur de coque, y compris les points de contrôle et les constantes de patch. La sortie est un vertex défini de la manière souhaitée. Si la sortie est envoyée au nuanceur de pixels, la sortie doit inclure une position (désignée par une sémantique SV_Position).

Pour concevoir un nuanceur de domaine

  1. Définissez l’attribut de domaine.

    [domain("quad")]
    

    Le domaine est défini pour un correctif quad.

  2. Déclarez l’emplacement sur la coque avec la valeur système de l’emplacement du domaine .

    • Pour un correctif quad, utilisez un float2.
    • Pour un tri patch, utilisez un float3 (pour les coordonnées barycentriques)
    • Pour une isoline, utilisez un float2.

    Par conséquent, l’emplacement de domaine d’un correctif quad ressemble à ceci :

    float2 UV : SV_DomainLocation
    
  3. Définissez les autres entrées.

    Les autres entrées proviennent du nuanceur de coque et sont définies par l’utilisateur. Cela inclut les points de contrôle d’entrée pour le correctif, dont il peut y avoir entre 1 et 32 points, et les données constantes du correctif d’entrée.

    Les points de contrôle sont définis par l’utilisateur, généralement avec une structure telle que celle-ci (définie dans How To: Design a Hull Shader) :

    const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
    

    Les données de constante de correctif sont également définies par l’utilisateur et peuvent ressembler à celle-ci (définie dans How To: Design a Hull Shader) :

    HS_CONSTANT_DATA_OUTPUT input
    
  4. Ajouter du code défini par l’utilisateur pour calculer les sorties ; il s’agit du corps du nuanceur de domaine.

    Cette structure contient des sorties de nuanceur de domaine définies par l’utilisateur.

    struct DS_OUTPUT
    {
        float3 vNormal    : NORMAL;
        float2 vUV        : TEXCOORD;
        float3 vTangent   : TANGENT;
        float3 vBiTangent : BITANGENT;
    
        float4 vPosition  : SV_POSITION;
    };
    

    La fonction prend chaque UV d’entrée (du tessellateur) et évalue le patch de Bézier à cette position.

    [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;    
    }
    

    La fonction est appelée une fois pour chaque point généré par le tessellateur de fonction fixe. Étant donné que cet exemple utilise un correctif quad, l’emplacement du domaine d’entrée (SV_DomainLocation) est un float2 (UV) ; un patch tri aurait un emplacement d’entrée float3 (coordonnées barycentriques UVW) et une isoline aurait un emplacement de domaine d’entrée float2.

    Les autres entrées de la fonction proviennent directement du nuanceur de coque. Dans cet exemple, il s’agit de 16 points de contrôle, chacun étant un BEZIER_CONTROL_POINT, ainsi que de corriger les données constantes (HS_CONSTANT_DATA_OUTPUT). La sortie est un sommet contenant les données souhaitées , DS_OUTPUT dans cet exemple.

Après avoir conçu un nuanceur de domaine, consultez Guide pratique pour créer un nuanceur de domaine.

Utilisation de Direct3D 11

Vue d’ensemble de tessellation