netlib.narod.ru< Назад | Оглавление | Далее >

19.6. Использование эффекта

В данном разделе и его подразделах мы покажем как использовать созданный эффект. В приведенном ниже списке перечислены действия, необходимые для использования эффекта:

  1. Получить дескриптор техники из файла эффектов, которая будет использоваться.

  2. Активировать требуемую технику.

  3. Начать исполнение активной техники.

  4. Для каждого прохода визуализации из активной техники визуализировать необходимые объекты. Вспомните, что техника может состоять из нескольких проходов визуализации и мы должны визуализировать объекты по одному разу для каждого прохода.

  5. Закончить исполнение активной техники.

19.6.1. Получение дескриптора эффекта

Первый этап использования техники — это получение значения D3DXHANDLE для данной техники. Дескриптор техники может быть получен с помощью следующего метода:

D3DXHANDLE ID3DXEffect::GetTechniqueByName(
     LPCSTR pName // Имя техники
);

 

ПРИМЕЧАНИЕ
На практике в файле эффекта обычно содержится несколько техник, разработанных для различных типов оборудования. Таким образом, приложение обычно выполняет провекру возможностей системы для определения возможностей оборудования и выборе на основе данных проверки наилучшей техники. Взгляните на описание метода ID3DXEffect::ValidateTechnique в следующем разделе.

19.6.2. Активация эффекта

После получения дескриптора выбранной техники надо ее активировать. Это делает следующий метод:

HRESULT ID3DXEffect::SetTechnique(
     D3DXHANDLE hTechnique // Handle to the technique to set.
);

 

ПРИМЕЧАНИЕ
Перед тем, как активировать технику вы должны убедиться, что она соответствует установленному оборудованию. То есть вы должны гарантировать, что установленное оборудование поддерживает все возможности, используемые в данной технике. Для этого можно использовать следующий метод:
HRESULT ID3DXEffect::ValidateTechnique(
     D3DXHANDLE hTechnique // Дескриптор проверяемой техники
);
Вспомните, что в файле эффекта может быть несколько техник, каждая из которых пытается реализовать требуемый эффект, используя свой набор возможностей оборудования, в надежде на то, что хотя бы одна реализация техники сможет работать на компьютере пользователя. Поэтому для эффекта вам надо перебрать все доступные техники и проверить каждую из них с помощью метода ID3DXEffect::ValidateTechnique, чтобы убедиться какие техники работают, а какие — нет, и дальше действовать соотвественно результатам.

19.6.3. Начало эффекта

Для визуализации объектов с использованием эффекта мы должны поместить вызовы функций рисования между вызовами методов ID3DXEffect::Begin и ID3DXEffect::End. Эти функции включают и выключают эффект соответственно.

HRESULT ID3DXEffect::Begin(
     UINT* pPasses,
     DWORD Flags
);

19.6.4. Установка текущего прохода визуализации

Перед тем, как начать рисование объектов с использованием эффекта, нам необходимо указать используемый проход визуализации. Вспомните, что техника состоит из одного или нескольких проходов визуализации, каждый из которых включает свои состояния устройства, выборки и/или шейдеры, которые применяются в данном проходе. Проход визуализации устанавливается с помощью следующего метода:

HRESULT ID3DXEffect::Pass(
     UINT iPass // Идентифицирующий проход индекс
);

Проходы визуализации для техники нумеруются в порядке 0 ... n – 1 для n проходов. Таким образом, мы можем перебрать все проходы визуализации с помощью простого цикла for в теле которого будем рисовать все необходимые объекты. Пример реализации такого подхода приведен в разделе 19.6.6.

19.6.5. Завершение эффекта

После того, как завершена визуализация всех объектов во всех проходах, мы завершаем работу эффекта вызовом метода ID3DXEffect::End:

HRESULT ID3DXEffect::End(VOID);

19.6.6. Пример

Приведенный ниже фрагмент кода иллюстрирует все пять этапов, необходимых для использования эффекта:

// Файл эффекта:
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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz