Установка констант
Как и в случае с вершинными и пиксельными шейдерами нам необходима возможность инициализировать переменные эффекта из приложения. Однако, вместо таблицы констант, которой мы пользовались при работе с вершинными и пиксельными шейдерами, интерфейс ID3DXEffect предоставляет встроенные методы для инициализации переменных. Мы не будем приводить список всех методов для инициализации различных типов переменных, поскольку он очень велик и в нем много повторений. Если вам все же хочется увидеть полный список — обратитесь к документации DirectX SDK. Вот сокращенный список методов:
Функция | Описание |
HRESULT ID3DXEffect::SetFloat( D3DXHANDLE hParameter, FLOAT f ); |
Присваивает идентифицируемой дескриптором hParameter переменной с плавающей точкой из файла эффекта значение f |
HRESULT ID3DXEffect::SetMatrix( D3DXHANDLE hParameter, CONST D3DXMATRIX* pMatrix ); |
Инициализирует идентифицируемую дескриптором hParameter матрицу в файле эффекта, копируя в нее значения из матрицы на которую указывает pMatrix |
HRESULT ID3DXEffect::SetString( D3DXHANDLE hParameter, CONST LPCSTR pString ); |
Инициализирует идентифицируемую дескриптором hParameter строковую переменную в файле эффекта, копируя в нее текст из строки на которую указывает pString |
HRESULT ID3DXEffect::SetTexture( D3DXHANDLE hParameter, LPDIRECT3DBASETEXTURE9 pTexture ); |
Инициализирует идентифицируемый дескриптором hParameter объект текстуры в файле эффекта на основании текстуры, на которую указывает pTexture |
HRESULT ID3DXEffect::SetVector( D3DXHANDLE hParameter, CONST D3DXVECTOR4* pVector ); |
Инициализирует идентифицируемый дескриптором hParameter вектор в файле эффекта, копируя в него значения из вектора на который указывает pVector |
HRESULT ID3DXEffect::SetVertexShader( D3DXHANDLE hParameter, LPDIRECT3DVERTEXSHADER9 pVertexShader ); |
Инициализирует идентифицируемый дескриптором hParameter объект вершинного шейдера в файле эффекта на основании вершинного шейдера, на который указывает pVertexShader |
HRESULT ID3DXEffect::SetPixelShader( D3DXHANDLE hParameter, LPDIRECT3DPIXELSHADER9 pPShader ); |
Инициализирует идентифицируемый дескриптором hParameter объект пиксельного шейдера в файле эффекта на основании пиксельного шейдера, на который указывает pPShader |
D3DXHANDLE ID3DXEffect::GetParameterByName( D3DXHANDLE hParent, // область видимости переменной - // родительская структура LPCSTR pName // имя переменной );
Его сигнатура аналогична методу ID3DXConstantTable::GetConstantByName. То есть первый параметр — это значение типа D3DXHANDLE, идентифицирующее родительскую структуру в пределах которой живет переменная, дескриптор которой мы хотим получить. Для глобальных переменных родительская структура отсутствует, и в этом параметре мы передаем null. Второй параметр — это имя переменной в том виде, в котором оно приведено в коде файла эффекта.
Для примера давайте взглянем на инициализацию нескольких переменных в файле эффекта:
// Данные для инициализации D3DXMATRIX M; D3DXMatrixIdentity(&M);
D3DXVECTOR4 color(1.0f, 0.0f, 1.0f, 1.0f);
IDirect3DTexture9* tex = 0; D3DXCreateTextureFromFile(Device, "shade.bmp", &tex);
// Получаем дескрипторы параметров D3DXHANDLE MatrixHandle = Effect->GetParameterByName(0, "Matrix"); D3DXHANDLE MtrlHandle = Effect->GetParameterByName(0, "Mtrl"); D3DXHANDLE TexHandle = Effect->GetParameterByName(0, "Tex");
// Инициализируем параметры Effect->SetMatrix(MatrixHandle, &M); Effect->SetVector(MtrlHandle, &color); Effect->SetTexture(TexHandle, tex);
ПРИМЕЧАНИЕ
HRESULT ID3DXEffect::GetMatrix( D3DXHANDLE hParameter, D3DXMATRIX* pMatrix );