Дескрипторы (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. Handle = NULL. Существует четыре случая.
    • Если это возвращаемое значение метода, метод не смог найти дескриптор.
    • Если дескриптор NULL передается в качестве первого параметра GetParameter[ByName| Элемент| BySemantic], функция возвращает параметр верхнего уровня. И наоборот, если дескриптор не равен NULL, функция возвращает элемент структуры или элемент, определенный дескриптором.
    • Если дескриптор NULL передается в качестве первого аргумента ValidateTechnique или второго аргумента IsParameterUsed, текущий метод проверяется.
    • Если дескриптор NULL передается в качестве первого аргумента FindNextValidTechnique, поиск допустимого метода начинается с первого метода в эффекте.

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

Примеры

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

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

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