Handles (Direct3D 9)

Les handles fournissent un moyen efficace de référencer les techniques, les passes, les annotations et les paramètres avec ID3DXEffectCompiler ou ID3DXEffect. Elles sont générées dynamiquement lorsque vous appelez des fonctions de la forme Get[Parameter| Annotation| Fonction| Technique| Pass][ByName| ParSemantic| Élément].

Lors de l’exécution d’un programme, la génération d’un handle pour le même objet plusieurs fois retourne le même handle à chaque fois. Mais ne comptez pas sur le handle qui reste constant lorsque vous exécutez votre programme plusieurs fois. Sachez également que les handles générés par différentes instances de ID3DXEffect et ID3DXEffectCompiler seront différents.

Si vous affichez les fichiers d’en-tête, vous remarquerez que les handles (D3DXHANDLEs) sont techniquement des pointeurs de chaîne.

Descripteurs que vous passez à des fonctions telles que GetParameter[ByName| Élément | BySemantic] ou GetAnnotation[ByName] peuvent être sous trois formes comme suit :

  1. Handles retournés par des fonctions telles que GetParameter[ByName| Élément | ParSemantic].
  2. Chaînes telles que MyVariableName, MyTechniqueName ou MyArray[0].
  3. Handle = NULL. Il y a quatre cas.
    • S’il s’agit d’une valeur de retour de méthode, la méthode n’a pas pu trouver le handle.
    • Si un handle NULL est passé en tant que premier paramètre de GetParameter[ByName| Élément | BySemantic], la fonction retourne un paramètre de niveau supérieur. À l’inverse, si le handle n’est pas NULL, la fonction retourne un membre de structure ou un élément identifié par le handle.
    • Si un handle NULL est passé en tant que premier argument de ValidateTechnique ou deuxième argument de IsParameterUsed, la technique actuelle est validée.
    • Si un handle NULL est passé en tant que premier argument de FindNextValidTechnique, la recherche d’une technique valide commence à la première technique de l’effet.

Conseil de performances Au début de votre application, effectuez une passe d’initialisation pour générer des handles à partir des chaînes. À partir de là, utilisez uniquement des handles. Le passage de chaînes au lieu de handles générés est plus lent.

Exemples

Voici quelques exemples d’utilisation de Get[Parameter| Annotation| Fonction| Technique| Pass][ByName| ParSemantic| Élément] fonctions pour générer des handles.

// Gets handle of second top-level parameter handle in the effect file
h1 = GetParameter(NULL, 1);    

// Gets handle of the third struct member of MyStruct
h2 = GetParameter("MyStruct", 2); 

// Gets handle of the third array element handle of MyArray
h3 = GetParameterElement("MyArray", 2); 

// Gets handle of first member of h1 (that is, the second top-level param)
h4 = GetParameter(h1, 0);    

// Gets handle of MyStruct.Data
h5 = GetParameterByName("MyStruct", "Data");    
// or 
h6 = GetParameterByName(NULL, "MyStruct.Data");    

// Gets handle of MyStruct.Data.SubData
h7 = GetParameterByName("MyStruct.Data", "SubData"); 
// or 
h8 = GetParameterByName(NULL, "MyStruct.Data.SubData");

// Gets handle of fifth annotation of h1 (that is, second top-level param)
h9 = GetAnnotation(h1, 4);    

// Gets handle of MyStruct's annotation, called Author
h10 = GetAnnotationByName("MyStruct", "Author");  
// or
h11 = GetParameterByName(NULL, "MyStruct@Author"); 

Format de l’effet