Guide pratique pour concevoir un nuanceur de coque

Un nuanceur de coque est la première des trois phases qui fonctionnent ensemble pour mettre en œuvre le pavage (les deux autres phases sont le tessellateur et un nuanceur de domaine). Cette rubrique montre comment concevoir un nuanceur de coque.

Un nuanceur de coque nécessite deux fonctions, l’main nuanceur de coque et une fonction constante de patch. Le nuanceur de coque implémente des calculs sur chaque point de contrôle ; le nuanceur de coque appelle également la fonction de constante patch qui implémente des calculs sur chaque correctif.

Une fois que vous avez conçu un nuanceur de coque, consultez How To: Create a Hull Shader pour savoir comment créer un nuanceur de coque.

Pour concevoir un nuanceur de coque

  1. Définissez les points de contrôle d’entrée et de sortie du nuanceur de coque.

    // 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. Définissez les données de constante de correctif de sortie.

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

    Pour un domaine quad, SV_TessFactor définit 4 facteurs de pavage d’arêtes (pour mettre en sillonner les bords), car le tessellateur de fonction fixe doit savoir combien il doit tessellater. Les sorties requises sont différentes pour les domaines triangle et isoligne.

    Le tessellateur de fonction fixe n’examine pas d’autres sorties de nuanceur de coque, telles que d’autres données de constante corrective ou l’un des points de contrôle. Le nuanceur de domaine, appelé pour chaque point généré par le tessellator de fonction fixe, voit comme entrée tous les points de contrôle de sortie du nuanceur de coque et toutes les données de constante de correctif de sortie ; le nuanceur évalue le correctif à son emplacement.

  3. Définissez une fonction de constante corrective. Une fonction de constante de correctif s’exécute une fois pour chaque correctif afin de calculer toutes les données constantes pour l’ensemble du correctif (par opposition aux données par point de contrôle, qui sont calculées dans le nuanceur de coque).

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

    Les propriétés de la fonction de constante de correctif sont les suivantes :

    • Une entrée spécifie une variable contenant un ID de correctif et est identifiée par la valeur système SV_PrimitiveID (voir sémantique dans le modèle de nuanceur 4).
    • Un paramètre d’entrée est les points de contrôle d’entrée, déclarés dans VS_CONTROL_POINT_OUTPUT dans cet exemple. Une fonction de correctif peut voir tous les points de contrôle d’entrée pour chaque correctif. Cet exemple comporte 32 points de contrôle par correctif.
    • Au minimum, la fonction doit calculer les facteurs de pavage par patch pour le stade tessellateur qui sont identifiés avec SV_TessFactor. Un domaine quad nécessite quatre facteurs de pavage pour les bords et deux facteurs supplémentaires (identifiés par SV_InsideTessFactor) pour la tesscellement à l’intérieur du patch. Le tessellateur de fonction fixe n’examine pas d’autres sorties de nuanceur de coque (telles que les données de constante corrective ou les points de contrôle).
    • Les sorties sont généralement définies par une structure et sont identifiées par HS_CONSTANT_DATA_OUTPUT dans cet exemple ; la structure dépend du type de domaine et serait différente pour les domaines triangle ou isoligne.

    En revanche, un nuanceur de domaine est appelé pour chaque point généré par le tessellator de fonction fixe et doit voir les points de contrôle de sortie et les données de constante de correctif de sortie (à partir du nuanceur de coque) pour évaluer un correctif à son emplacement.

  4. Définissez un nuanceur de coque. Un nuanceur de coque identifie les propriétés d’un patch, y compris une fonction de constante de patch. Un nuanceur de coque est appelé une fois pour chaque point de contrôle de sortie.

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

    Un nuanceur de coque utilise les attributs suivants :

Tous les points de contrôle d’entrée (identifiés par VS_CONTROL_POINT_OUTPUT) sont visibles pour chaque appel de nuanceur de coque. Dans cet exemple, il existe 32 points de contrôle d’entrée.

Un nuanceur de coque est appelé une fois par point de contrôle de sortie (identifié avec SV_OutputControlPointID) pour chaque correctif (identifié avec SV_PrimitiveID). L’objectif de ce nuanceur particulier est de calculer la sortie i, qui a été définie comme un point de contrôle BEZIER (cet exemple comporte 16 points de contrôle de sortie définis par des points de contrôle de sortie).

Un nuanceur de coque exécute une routine une fois par correctif (la fonction de constante de correctif) pour calculer les données de constante de correctif (facteurs de pavage au minimum). Séparément, un nuanceur de coque exécute une fonction de constante de patch (appelée SubDToBezierConstantsHS) sur chaque correctif pour calculer des données de constante de correctif, telles que des facteurs de mise en forme pour le stade tessellateur.

Comment utiliser Direct3D 11

Vue d’ensemble de la pavage