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

Замечание. При использовании фильтров В1гес18ко^, разработанных в этой главе, необхо-димозадать флагВ3ВСКЕАТЕ_МиЕТ1ТНКЕАВЕВпри вызове 1Втс13В9::Сгеа1еВеуке. Это позволяет сообщить В1ге&3В, что используется многопотоковое приложение (в котором фильтры являются отдельными потоками), и позволяет получить доступ к фильтрам данныхповерхности текстуры. Также необходимо использоватьмногопото-ковые динамические библиотеки (устанавливаемые внастройкахкомпилятора).

Создание буфера вершин

Чтобы использовать анимированную текстуру, необходимо сначала наложить ее в качестве обычной текстуры на полигон (или набор полигонов). Чтобы продемонстрировать анимированную текстуру, создайте простой квадратный полигон помощью двух треугольников. Вы можете сделать это при помощи буфера вершин и четырех вершин (задав ленту треугольников1).

// pDevice = предварительно инициализированное устройство Direct3D typedef struct {

float x, у, z; // 3D координаты

float u, v; // Текстурные координаты } sVertex;

#define VERTEXFVF (D3DFVF_XYZ | D3DFVF_TEX1)

// определить данные прямоугольника (два треугольника в ленте) sVertex Verts[4] = {

{ -128.0f, 128.0f, 0.0f, 0.0f, 0.0f },

{ 128.0f, 128.0f, 0.0f, 1.0f, 0.0f },

{ -128.0f, -128.0f, 0.0f, 0.0f, 1.0f },

{ 128.0f, -128.0f, 0.0f, 1.0f, 1.0f }

};

/ / Создать буфер вершин IDirect3DVertexBuffer9 *pVertices; pDevice->CreateVertexBuffer(sizeof(Verts), \

D3DUSAGE_WRITEONLY, VERTEXFVF, \

D3DPOOL_MANAGED, &pVertices);

// Установить данные вершин BYTE *VertPtr;

pVertices->Lock(0, 0, (BYTE**)&VertPtr, D3DLOCK_DISCARD); memcpy(VertPtr, Verts, sizeof(Verts)); pVertices->Unlock();

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

1. Лента треугольников (triangle strip) - один из способов задания полигона. Более подробно смотри справку по DirectX SDK.

После того как вы создали буфер вершин, пришло время загрузить ани-мированную текстуру.

Совет. Если вы используете двухмерное проигрывание видео (в противоположность визуализации текстуры на несколько полигонов), вы можете заменить непреобразо-ванные трехмерные координаты на набор преобразованных двухмерных (задав флаг FVFD3DFVFWYZRHW).

Загрузка анимированных текстур

Вы подготовили буфер вершин и, конечно же, файл анимированной текстуры. Все, что осталось сделать, - это загрузить текстуру и визуализировать сцену! Для этого примера унаследуйте от класса cAnimatedTexture класс, который бы циклически проигрывал видео, перегружая функцию EndOfAnimation так, чтобы она вызывала Reset при окончании видео. Вот унаследованный класс, который вы можете использовать:

class cAnimTexture : public cAnimatedTexture {

public:

BOOL EndOfAnimation() { Restart(); return TRUE; }

};

Далее просто создайте экземпляр класса cAnimTexture и при помощи функции Load загрузите видео.

cAnimTexture *g_Texture = new cAnimTexture() ; g_Texture->Load(pDevice, "Texture.avi");

На данный момент текстура загружена, и вы готовы к визуализации сцены.

Подготовка к визуализации

Пришло время подготовится визуализировать полигоны, использующие ани-мированную текстуру. Выполнить это можно с помощью обычного кода - ничего необычного здесь не происходит. Просто установите источник потока вершин, шей-дер, материал и текстуру. Все правильно, вам просто необходимо установить поверхность текстуры, содержащей видео данные; DirectShow сделает все остальное!

Следующий кусочек кода взят из примера этой главы и используется для установки источника потока вершин, FVF шейдера, материала и текстуры:

pDevice->SetFVF(VERTEXFVF);

pDevice->SetStreamSource(0, pVB, sizeof(sVertex)); pDevice->SetMaterial(&Material);

pDevice->SetTexture(0, g_Texture->GetTexture());

После того как вы установили источник, FVF шейдер, материал и текстуру, все, что необходимо сделать, - это нарисовать примитив.

Рисование и представление сцены

Опять же, чтобы нарисовать графические примитивы и представить сцену не надо делать ничего необычного. Т. к. DirectShow управляет потокам видео данных в фоновом режиме, вы можете рисовать примитивы, как если бы вы рисовали обычную сцену.

Следующий код визуализирует буфер вершин, освобождает использование источников текстур и вершин (для ликвидации утечек памяти) и представляет сцену.

pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); pDevice->SetStreamSource(0, NULL, 0) ; pDevice->SetTexture(0, NULL); pDevice->Present(NULL, NULL, NULL, NULL);

Вот и все - полностью анимированная текстура, наши поздравления DirectShow и Вам! После того как вы увидели насколько просто работать с анимированными текстурами, вы можете добавлять различные эффекты в ваши игры, такие как лицевые текстуры, полностью анимированные фоновые изображения и даже кинематографические последовательности, проигрываемые 3D движком.

Посмотрите демонстрационные программы

Для иллюстрирования технологий анимации текстур, о которых вы прочитали в этой главе, создано две демонстрационные программы. Обе эти программы отображают горный водопад (см. рис. 14.4), показываю лишь небольшую часть того, что может быть создано с помощью анимации текстур.

Первая демонстрационная программа Transformations использует преобразование текстур для плавного перемещения текстуры воды, создавая эффект водопада. Вторая демонстрационная программа TextureAnim использует фильтры видео текстур, разработанные в этой главе для анимации поверхности воды.

Создание менеджера анимированных текстур || Оглавление || Окончание современной анимации