Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming / GameProg / RPG_Programming_2ed.pdf
Скачиваний:
240
Добавлен:
12.02.2016
Размер:
12.06 Mб
Скачать

Джим Адамс

который вы хотите загрузить, и указатель на созданный вами объект

IDirect3DTexture9.

Вот пример использования функции D3DXCreateTextureFromFile для загрузки растрового изображения из файла с именем

texture.bmp в объект текстуры:

// g_pD3DDevice = ранее инициализированный объект устройства

IDirect3DTexture9 *pD3DTexture;

if(FAILED(D3DXCreateTextureFromFile(g_pD3DDevice, "texture.bmp", (void**)&pD3DTexture))) {

// Произошла ошибка

}

Самое лучшее в этой функции то, что она выполняет всю инициализацию за вас и помещает структуру в память D3DPOOL_MANAGED,

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

DirectX 8).

Установка текстуры

Как говорилось раньше, в разделе «Использование наложения текстур в Direct3D», видеокарта должна подготовиться к использованию текстуры для визуализации. Эта подготовка должна быть выполнена перед тем, как будет визуализироваться полигон с текстурой. Если у вас 1000 полигонов и для каждого полигона используется своя текстура, вы должны в цикле перебирать полигоны, устанавливать для каждого полигона его текстуру и визуализировать его.

Вы повторяете этот процесс, пока не будут визуализированы все полигоны. Если несколько полигонов используют одну и ту же текстуру, более эффективно установить текстуру и визуализировать все полигоны, которые используют ее, вместо того, чтобы использовать цикл установки текстуры и визуализации для каждого полигона.

Для установки текстуры используют функцию

IDirect3DDevice9::SetTexture:

HRESULT IDirect3DDevice9::SetTexture(

DWORD Stage, // Этап текстурирования 0 – 7

IDirect3DBaseTexture9 *pTexture); // Устанавливаемый объект текстуры

Вы видите, где передается созданный вами объект текстуры (как pTexture), но что за параметр Stage? Он называется этапом

текстурирования (texture stage) и это одна из самых захватывающих техник наложения текстур в Direct3D.

Процесс наложения текстур в Direct3D очень гибкий. Текстура не берется из единственного источника, а может быть построена с использованием целых восьми различных источников. Эти источники, называемые этапами текстурирования (texture stage), нумеруются от 0 до 7. При визуализации полигона для каждого рисуемого пикселя Direct3D

netlib.narod.ru

113

Глава 2. Рисование с DirectX Graphics

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

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

Рис. 2.16. Каждый этап текстурирования модифицирует исходный пиксель различными способами. Здесь исходный пиксель проходит через ряд изменений для получения итогового пикселя

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

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

//g_pD3DDevice = ранее инициализированный объект устройства

//pD3DTexture = загруженный объект текстуры

//Устанавливаем текстуру для этапа 0

g_pD3DDevice->SetTexture(0, pTexture);

//Устанавливаем параметр этапа - это необходимо делать

//один раз в программе

g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);

g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);

g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);

g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);

114

netlib.narod.ru

Джим Адамс

Это основной набор операций с текстурами и вы будете встречать его достаточно часто. Обратите внимание, что вы устанавливаете параметры

этапа текстурирования только одни раз, и затем полагаетесь на вызов SetTexture. Чтобы узнать больше об использовании этапов

текстурирования, обратитесь к документации DX SDK.

Когда вы закончили использовать текстуру (после визуализации полигонов), вы вызываете функцию SetTexture еще раз, указав в параметре pTexture значение NULL:

g_pD3DDevice->SetTexture(0, NULL);

Этот вызов удаляет данные текстуры из памяти и видеопроцессора. Если не сделать этого, в программе появятся утечки памяти, которые могут привести даже к краху вашей игры.

Использование выборок

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

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

Чтобы использовать выборку в Direct3D необходимо воспользоваться функцией IDirect3DDevice9::SetSamplerState:

HRESULT IDirect3DDevice9::SetSamplerState(

DWORD

Sampler, //

Этап текстурирования/выборки 0 - 7

D3DSAMPLERSTATETYPE

Type,

//

Устанавливаемый режим

DWORD

Value);

//

Используемое значение

В этой книге я буду задавать только две выборки:

D3DSAMP_MINFILTER и D3DSAMP_MAGFILTER. Оба этих состояния

определяют как Direct3D смешивает близлежащие пиксели внутри текстуры

перед выводом пикселя на экран. Первое состояние, D3DSAMP_MAGFILTER, используется когда текстура растягивается на полигон (увеличивается), а D3DSAMP_MINFILTER — когда текстура

сжимается (уменьшается).

Аргумент Value может принимать одно из значений, перечисленных в таблице 2.6.

netlib.narod.ru

115

Глава 2. Рисование с DirectX Graphics

Таблица 2.6. Типы фильтров выборки текстуры в Direct3D

Значение

Описание

 

 

 

 

 

 

 

D3DTEXF_NONE

Фильтр не используется

 

 

D3DTEXF_POINT

Самый

быстрый

режим

фильтрации.

 

Используется цвет единственной точки из

 

текстуры

 

 

 

D3DTEXF_LINEAR

D3DTEXF_ANISOTROPIC

Режим билинейной интерполяции. Этот режим для получения итогового смешанного пикселя комбинирует четыре пикселя текстуры. Достаточно быстрый режим наложения текстуры, позволяющий получить сглаженное изображение

Анизотропная фильтрация компенсирует угловые различия между экраном и текстурируемым полигоном. Хорошо, но медленно

Как правило, вы будете использовать режимы фильтрации

D3DTEXF_POINT или D3DTEXF_LINEAR; они быстрые, а линейный

режим еще и сглаживает результат. Чтобы использовать какой-нибудь режим фильтрации просто добавьте следующий код:

//g_pD3DDevice = ранее инициализированный объект устройства

//Установка фильтра увеличения

if(FAILED(g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT))) {

// Произошла ошибка

}

// Установка фильтра уменьшения if(FAILED(g_pD3DDevice->SetSamplerState(0,

D3DTSS_MINFILTER, D3DTEXF_POINT))) { // Произошла ошибка

}

Визуализация текстурированных объектов

Перед тем, как вы сможете рисовать объект (полигон или набор полигонов) с текстурой, вы должны убедиться, что в данные вершин полигона включена пара координат U, V. Структура данных вершины, содержащая только набор трехмерных координат и координаты текстуры, выглядит так:

typedef struct

{

//

Вектор местоположения вершины

D3DVECTOR3

Position;

float

tu, tv;

//

Здесь добавляем координаты текстуры!

} sVertex;

 

 

 

Теперь вы конструируете макроопределение настраиваемого формата вершин, чтобы информировать Direct3D о том, какие компоненты данных вершины используются. В данном случае компоненты — это непреобразованные трехмерные координаты и пара координат текстуры.

116

netlib.narod.ru

Соседние файлы в папке GameProg