Utilisation de boucles for dans votre réseau ShaderFX

Utilisation d'un noeud Code personnalisé

Vous pouvez créer une boucle for de différentes manières. Vous pouvez créer un noeud Code personnalisé. Choisissez Outils Activer/Désactiver le mode Avancé pour passer en mode Avancé, puis choisissez Noeuds d'ombrage matériels Divers Code personnalisé. Dans le groupe de fonctions Propriétés, cliquez sur le bouton Editer pour saisir votre code dans la boîte de dialogue de l'éditeur Code personnalisé qui s'affiche. Utilisez des fonctions compatibles avec le pilote de fenêtre DirectX.

Utilisation d'un noeud de boucle for

Pour créer un noeud de boucle for, vous devez également être en mode Avancé.

L'exemple suivant montre comment utiliser une boucle for pour échantillonner une texture à trois reprises avec des décalages UV différents. Les valeurs échantillonnées sont ajoutées, le total est divisé par trois et la valeur moyenne est appliquée au canal Couleur diffuse de TraditionalGameSurfaceShader.

Configuration de la boucle for :

  1. Dans l'espace de travail ShaderFX, cliquez avec le bouton droit de la souris sur Outils Activer/Désactiver le mode Avancé afin de vous assurer que ce mode est actif.
  2. Cliquez avec le bouton droit et choisissez Noeuds d'ombrage matériels Commande de flux Boucle for pour créer un noeud ForOp.
    Conseil : Si le port est carré, cela signifie qu'il peut accepter plusieurs entrées.
  3. Choisissez Noeuds d'ombrage matériels Valeurs Entier pour créer un noeud Entier. Dans le groupe de fonctions Propriétés, définissez sa valeur sur 3. Connectez-le à l'attribut B du noeud de boucle for.
    • L'attribut A représente le point de départ de la boucle.
    • L'attribut B représente la fin de la boucle.
    • L'attribut C représente l'intervalle de la boucle.
    • Par défaut, la valeur de l'attribut A est 0 et celle de l'attribut C est 1. Si vous utilisez ces valeurs par défaut pour votre boucle, il n'est pas nécessaire de connecter ces attributs.

      Dans cet exemple, nous définissons for i = 0, i < 3, i++. Il n'est donc pas nécessaire de définir de manière explicite les valeurs A et C.

  4. Choisissez Noeuds d'ombrage matériels Divers Chaîne pour créer une chaîne qui sera utilisée comme itérateur. Dans le groupe de fonctions Propriétés, sélectionnez i dans la liste déroulante Options par défaut (vous devez faire défiler la liste vers le bas pour voir cette option). Connectez le port de sortie du noeud Chaîne à l'attribut Itérateur du noeud de boucle for.
  5. Choisissez Noeuds d'ombrage matériels Valeurs Float3 pour créer une variable dans laquelle stocker les valeurs qui sont calculées à l'intérieur de la boucle.
    Conseil : Utilisez Float3 ou Float4 pour stocker les valeurs. N'utilisez pas un noeud Couleur.
  6. Dans le groupe de fonctions Propriétés, renommer le noeud Float3 LoopResult et vérifiez que les trois valeurs sont initialisées à 1.0.
  7. Connectez le noeud LoopResult à l'attribut Variables du noeud de boucle for. Comme il s'agit d'une boucle simple n'utilisant qu'une seule variable, connectez également LoopResult à l'attribut Sortie de la boucle for.

Configuration de l'échantillonnage de texture :

  1. Choisissez Noeuds d'ombrage matériels Textures Map Texture pour créer un noeud TextureMap. Dans le groupe de fonctions Propriétés, utilisez les commandes MyTexture / Trajectoire pour attribuer un fichier de texture à ce noeud.

    Dans le groupe de fonctions Propriétés, assurez-vous que les attributs Echantillonnage / Coordonnée U et Echantillonnage / Coordonnée V sont définis sur ENVELOPPER.

    Puisque la texture est échantillonnée avec un décalage, l'échantillonnage peut dépasser la plage UV de 0 à 1. En définissant ces attributs sur ENVELOPPER, vous vous assurez que les pixels sont échantillonnés depuis le début de la texture lorsque la plage UV dépasse 1.0.

  2. Choisissez Noeuds d'ombrage matériels Valeurs Réseau pour créer un noeud Réseau. Les trois jeux de valeurs de décalage sont stockés dans ce réseau.
  3. Choisissez Noeuds d'ombrage matériels Valeurs Float2 à trois reprises pour créer trois noeuds Float2 pour le stockage de trois jeux de valeurs de décalage. Utilisez le groupe de fonctions Propriétés pour définir les trois attributs Float2 comme suit :
    • Nom : Offset1, X: 0.1, Y: 0.3
    • Nom : Offset2, X: 0.2, Y: -0.4
    • Nom : Offset3, X: 0.3, Y: 0.2
  4. Connectez les trois noeuds Float2 à l'attribut Valeurs du noeud Réseau.
  5. Choisissez Noeuds d'ombrage matériels Entrées communes Jeu d'UV pour créer un jeu d'UV, et Noeuds d'ombrage matériels Mathématique Ajouter pour créer un noeud Ajouter.
  6. Connectez les noeuds comme suit :
    • Connectez l'attribut Valeur de Réseau à l'attribut Valeur d'Ajouter.
    • Connectez l'attribut UV de Jeu d'UV à l'autre attribut Valeur d'Ajouter.
    • Connectez l'attribut Résultat d'Ajouter à l'attribut UV de TextureMap.
    • Connectez l'attribut Sortie de l'itérateur (noeud Chaîne) à l'attribut Index de Réseau. Cela permet à la boucle for d'obtenir les valeurs de décalage.
    • Connectez l'attribut Couleur de Map Texture à l'attribut Calculs de la boucle for. Cela permet de définir les calculs dans la boucle for, qui échantillonne la map texture à trois reprises.

Calcul de la moyenne des résultats échantillonnés :

  1. Choisissez Noeuds d'ombrage matériels Divers Chaîne pour créer un noeud Chaîne. Dans le groupe de fonctions Propriétés, sélectionnez += dans la liste déroulante Options par défaut.
  2. Connectez la valeur Sortie du nouveau noeud Chaîne à l'attribut Opérateurs du noeud de boucle for.

    La boucle for ajoute les résultats de l'échantillonnage de texture à la variable Résultat de boucle.

  3. Choisissez Noeuds d'ombrage matériels Mathématique Diviser pour créer un noeud Diviser. Connectez l'attribut Sortie de la boucle for au premier attribut Valeur de Diviser.

    La valeur de Résultat de boucle étant la somme de trois lignes échantillonnées, elle doit être divisée par trois pour obtenir la moyenne.

  4. Choisissez Noeuds d'ombrage matériels Valeurs Flottant pour créer un noeud Flottant. Dans le groupe de fonctions Propriétés, définissez sa valeur sur 3.0. Connectez son attribut Flottant à l'autre attribut Valeur de Diviser afin de diviser la somme des résultats échantillonnés par trois.
  5. Connectez l'attribut Résultat de Diviser à l'attribut Couleur diffuse de TraditionalGamesSurfaceShader.

Résultat de l'itération d'un motif en damier (rendu avec le rendu Quicksilver)

Vous pouvez exporter votre matériau ShaderFX vers un fichier d'ombrage et examiner le code d'ombrage pour afficher la boucle for que vous venez de créer :

float3 LoopResult = float3(1.0, 1.0, 1.0);	
for(int i=0; i<3; i+=1)	
{		
    float2 AddOp = (Array_bphdfiwhhj[i] + IN.map1.xy);		
    float4 Sampler = chessboard_woodjpg.Sample(MMMLWWWSampler, AddOp);		
    LoopResult += Sampler.xyz;
}

Pour plus d'informations sur l'exportation vers un fichier d'ombrage, reportez-vous à la rubrique Exportation vers HLSL, CgFX et GLSL.