Дескрипторы (Direct3D 9)
Дескрипторы предоставляют эффективные средства для ссылки на методы, проходы, заметки и параметры с помощью ID3DXEffectCompiler или ID3DXEffect. Они создаются динамически при вызове функций в формате Get[Parameter| Заметка| Функция| Метод | Pass][ByName| BySemantic| Элемент].
При запуске программы создание дескриптора для одного и того же объекта несколько раз будет возвращать один и тот же дескриптор каждый раз. Но не полагайтесь на то, что дескриптор останется постоянным при многократном запуске программы. Кроме того, имейте в виду, что дескрипторы, созданные различными экземплярами ID3DXEffect и ID3DXEffectCompiler , будут отличаться.
При просмотре файлов заголовков вы заметите, что дескрипторы (D3DXHANDLEs) являются технически строковыми указателями.
Дескриптора, которые передаются в такие функции, как GetParameter[ByName| Элемент | BySemantic] или GetAnnotation[ByName] могут иметь три формы:
- Дескрипторы, возвращаемые такими функциями, как GetParameter[ByName| Элемент | BySemantic].
- Строки, такие как MyVariableName, MyTechniqueName или MyArray[0].
- Дескриптор = 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");
Связанные темы