Введение в программирование трехмерных игр с DX9

       

Установка констант



16.2.1.2. Установка констант

Как только наше приложение получило значение D3DXHANDLE, ссылающееся на требуемую переменную в коде шейдера, мы можем установить значение этой переменной из нашего приложения с помощью метода ID3DXConstantTable::SetXXX, где XXX заменяется на название типа переменной, значение которой устанавливается. Например, если мы хотим установить значения массива векторов, следует воспользоваться методом SetVectorArray.

Общий синтаксис всех методов ID3DXConstantTable::SetXXX выглядит так:

HRESULT ID3DXConstantTable::SetXXX( LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, XXX value );

pDevice — Указатель на устройство с которым связана таблица констант.

hConstant — Дескриптор, ссылающийся на переменную, значение которой мы устанавливаем.

value — Присваиваемое переменной значение, где XXX заменяется на название типа переменной, значение которой мы устанавливаем. Для некоторых значений (bool, int, float) мы передаем само значение, а для других (векторы, матрицы, структуры) — ссылку на значение.

Если мы инициализируем массив, то у метода SetXXX появляется дополнительный четвертый параметр, задающий количество элементов массива. Например, прототип метода для установки значений массива четырехмерных векторов, выглядит так:

HRESULT ID3DXConstantTable::SetVectorArray( LPDIRECT3DDEVICE9 pDevice, // связанное устройство D3DXHANDLE hConstant, // дескриптор переменной шейдера CONST D3DXVECTOR4* pVector, // указатель на массив UINT Count // количество элементов массива );

Приведенный ниже список описывает типы, которые мы можем инициализировать с помощью интерфейса ID3DXConstantTable. Подразумевается, что корректное устройство (Device) и корректный дескриптор переменной (handle) уже получены.

SetBool — используется для установки логических значений. Пример вызова:

bool b = true; ConstTable->SetBool(Device, handle, b);

SetBoolArray — Используется для установки массива логических значений.
Пример вызова:

bool b[3] = {true, false, true}; ConstTable->SetBoolArray(Device, handle, b, 3);

SetFloat — Используется для установки значения с плавающей точкой. Пример вызова:

float f = 3.14f; ConstTable->SetFloat(Device, handle, f);

SetFloatArray — Используется для установки массива значений с плавающей точкой. Пример вызова:

float f[2] = {1.0f, 2.0f}; ConstTable->SetFloatArray(Device, handle, f, 2);

SetInt — Используется для установки целочисленного значения. Пример вызова:

int x = 4; ConstTable->SetInt(Device, handle, x);

SetIntArray — Используется для установки массива целых чисел. Пример вызова:

int x[4] = {1, 2, 3, 4}; ConstTable->SetIntArray(Device, handle, x, 4);

SetMatrix — Используется для установки матрицы 4 × 4. Пример вызова:

D3DXMATRIX M(...); ConstTable->SetMatrix(Device, handle, &M);

SetMatrixArray — Используется для установки массива матриц 4 × 4. Пример вызова:

D3DXMATRIX M[4];

// ...Инициализация матриц

ConstTable->SetMatrixArray(Device, handle, M, 4);

SetMatrixPointerArray — Используется для установки массива указателей на матрицы 4 × 4. Пример вызова:

D3DXMATRIX* M[4];

// ...Выделение памяти и инициализация указателей

ConstTable->SetMatrixPointerArray(Device, handle, M, 4);

SetMatrixTranspose — используется для установки транспонированной матрицы 4 × 4. Пример вызова:

D3DXMATRIX M(...); D3DXMatrixTranspose(&M, &M); ConstTable->SetMatrixTranspose(Device, handle, &M);

SetMatrixTransposeArray — Используется для установки массива транспонированных матриц 4 × 4. Пример вызова:

D3DXMATRIX M[4];

// ...Инициализация матриц и их транспонирование

ConstTable->SetMatrixTransposeArray(Device, handle, M, 4);

SetMatrixTransposePointerArray — Используется для установки массива указателей на транспонированные матрицы 4 × 4.Пример вызова:

D3DXMATRIX* M[4];

// ...Выделение памяти, инициализация указателей и транспонирование

ConstTable->SetMatrixTransposePointerArray(Device, handle, M, 4);

SetVector — Используется для установки переменной типа D3DXVECTOR4. Пример вызова:

D3DXVECTOR4 v(1.0f, 2.0f, 3.0f, 4.0f); ConstTable->SetVector(Device, handle, &v);

SetVectorArray — Используется для установки массива векторов. Пример вызова:

D3DXVECTOR4 v[3];

// ...Инициализация векторов

ConstTable->SetVectorArray(Device, handle, v, 3);

SetValue — Используется для установки значения произвольного размера, например, структуры. В приведенном примере мы используем SetValue для установки значений D3DXMATRIX:

D3DXMATRIX M(...); ConstTable->SetValue(Device, handle, (void*)&M, sizeof(M));


Содержание раздела