Дескрипторы (Direct3D 9)

Дескрипторы предоставляют эффективные средства для ссылки на методы, проходы, заметки и параметры с помощью ID3DXEffectCompiler или ID3DXEffect. Они создаются динамически при вызове функций в формате Get[Parameter| Заметка| Функция| Метод | Pass][ByName| BySemantic| Элемент].

При запуске программы создание дескриптора для одного и того же объекта несколько раз будет возвращать один и тот же дескриптор каждый раз. Но не полагайтесь на то, что дескриптор останется постоянным при многократном запуске программы. Кроме того, имейте в виду, что дескрипторы, созданные различными экземплярами ID3DXEffect и ID3DXEffectCompiler , будут отличаться.

При просмотре файлов заголовков вы заметите, что дескрипторы (D3DXHANDLEs) являются технически строковыми указателями.

Дескриптора, которые передаются в такие функции, как GetParameter[ByName| Элемент | BySemantic] или GetAnnotation[ByName] могут иметь три формы:

  1. Дескрипторы, возвращаемые такими функциями, как GetParameter[ByName| Элемент | BySemantic].
  2. Строки, такие как MyVariableName, MyTechniqueName или MyArray[0].
  3. Дескриптор = NULL. Есть четыре случая.
    • Если это возвращаемое значение метода, методу не удалось найти дескриптор.
    • Если дескриптор NULL передается в качестве первого параметра GetParameter[ByName| Элемент | BySemantic], функция возвращает параметр верхнего уровня. И наоборот, если дескриптор не равен NULL, функция возвращает элемент структуры или элемент, определенный дескриптором.
    • Если дескриптор NULL передается в качестве первого аргумента ValidateTechnique или второго аргумента IsParameterUsed, проверяется текущий метод.
    • Если дескриптор NULL передается в качестве первого аргумента FindNextValidTechnique, поиск допустимого метода начинается с первого метода в эффекте.

Совет по производительности. В начале приложения выполните этап инициализации, чтобы создать дескрипторы из строк. С этого момента используйте только дескрипторы. Передача строк вместо созданных дескрипторов выполняется медленнее.

Примеры

Ниже приведены некоторые примеры использования Get[Parameter| Заметка| Функция| Метод | Pass][ByName| BySemantic| Функции element] для создания дескрипторов.

// 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"); 

Формат эффекта