netlib.narod.ru | < Назад | Оглавление | Далее > |
В данном разделе и его подразделах мы покажем как использовать созданный эффект. В приведенном ниже списке перечислены действия, необходимые для использования эффекта:
Получить дескриптор техники из файла эффектов, которая будет использоваться.
Активировать требуемую технику.
Начать исполнение активной техники.
Для каждого прохода визуализации из активной техники визуализировать необходимые объекты. Вспомните, что техника может состоять из нескольких проходов визуализации и мы должны визуализировать объекты по одному разу для каждого прохода.
Закончить исполнение активной техники.
Первый этап использования техники — это получение значения D3DXHANDLE для данной техники. Дескриптор техники может быть получен с помощью следующего метода:
D3DXHANDLE ID3DXEffect::GetTechniqueByName( LPCSTR pName // Имя техники );
После получения дескриптора выбранной техники надо ее активировать. Это делает следующий метод:
HRESULT ID3DXEffect::SetTechnique( D3DXHANDLE hTechnique // Handle to the technique to set. );
HRESULT ID3DXEffect::ValidateTechnique( D3DXHANDLE hTechnique // Дескриптор проверяемой техники );Вспомните, что в файле эффекта может быть несколько техник, каждая из которых пытается реализовать требуемый эффект, используя свой набор возможностей оборудования, в надежде на то, что хотя бы одна реализация техники сможет работать на компьютере пользователя. Поэтому для эффекта вам надо перебрать все доступные техники и проверить каждую из них с помощью метода ID3DXEffect::ValidateTechnique, чтобы убедиться какие техники работают, а какие — нет, и дальше действовать соотвественно результатам.
Для визуализации объектов с использованием эффекта мы должны поместить вызовы функций рисования между вызовами методов ID3DXEffect::Begin и ID3DXEffect::End. Эти функции включают и выключают эффект соответственно.
HRESULT ID3DXEffect::Begin( UINT* pPasses, DWORD Flags );
pPasses — Возвращает количество проходов в активной технике.
Flags — Любой из следующих флагов:
Zero (0) — Приказывает эффекту сохранить текущее состояние устройства и состояние шейдеров и восстановить их после завершения эффекта (при вызове ID3DXEffect::End). Это очень полезно, поскольку файл эффекта может менять состояния и часто требуется вернуть состояния, которые были до начала обработки эффекта.
D3DXFX_DONOTSAVESTATE — Приказывает не сохранять и не восстанавливать состояния устройства (за исключением состояния шейдеров).
D3DXFX_DONOTSAVESHADERSTATE — Приказывает эффекту не сохранять и не восстанавливать состояния шейдеров.
Перед тем, как начать рисование объектов с использованием эффекта, нам необходимо указать используемый проход визуализации. Вспомните, что техника состоит из одного или нескольких проходов визуализации, каждый из которых включает свои состояния устройства, выборки и/или шейдеры, которые применяются в данном проходе. Проход визуализации устанавливается с помощью следующего метода:
HRESULT ID3DXEffect::Pass( UINT iPass // Идентифицирующий проход индекс );
Проходы визуализации для техники нумеруются в порядке 0 ... n – 1 для n проходов. Таким образом, мы можем перебрать все проходы визуализации с помощью простого цикла for в теле которого будем рисовать все необходимые объекты. Пример реализации такого подхода приведен в разделе 19.6.6.
После того, как завершена визуализация всех объектов во всех проходах, мы завершаем работу эффекта вызовом метода ID3DXEffect::End:
HRESULT ID3DXEffect::End(VOID);
Приведенный ниже фрагмент кода иллюстрирует все пять этапов, необходимых для использования эффекта:
// Файл эффекта: technique T0 { pass P0 { ... } } ==================================== // Исходный код приложения // Получаем дескриптор техники. D3DXHANDLE hTech = 0; hTech = Effect->GetTechniqueByName("T0"); // Активируем технику Effect->SetTechnique(hTech); // Начинаем активную технику UINT numPasses = 0; Effect->Begin(&numPasses, 0); // Для каждого прохода визуализации for(int i = 0; i < numPasses; i++) { // Устанавливаем текущий проход Effect->Pass(i); // Визуализируем объекты для i-ого прохода Sphere->Draw(); } // Завершаем эффект Effect->End();
netlib.narod.ru | < Назад | Оглавление | Далее > |