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

Джим Адамс

Показ сцены

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

HRESULT IDirect3DDevice9::Present(

CONST RECT

*pSourceRect,

CONST RECT

*pDestRect,

HWND

hDestWindowOverride,

CONST RGNDATA

*pDirtyRegion);

Абсолютно спокойно можете указывать для вех параметров функции

IDirect3DDevice9::Present значения NULL, что сообщит Direct3D о

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

// g_pD3DDevice = ранее инициализированный объект устройства if(FAILED(g_pD3DDevice->Present(NULL, NULL, NULL, NULL))) {

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

}

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

Использование наложения текстур

Хотя вы и научились рисовать трехмерные объекты на экране, одноцветные полигоны достаточно скучны. Пришло время сделать вещи интереснее и добавить несколько деталей. Один из простейших способов увеличить детализацию трехмерных объектов — использование техники, известной как наложение текстур. Наложение текстур (texture mapping) — это техника, применяемая для раскраски полигона с использованием изображения (как показано на рис 2.14), что улучшает визуальное оформление рисуемых объектов. Растровые изображения обычно называют текстурами (texture), поэтому при обсуждении трехмерной визуализации я буду использовать оба эти термина как взаимозаменяемые.

Рис. 2.14. При наложении текстуры вы берете плоские полигоны и рисуете на их поверхности картинку

netlib.narod.ru

109

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

При наложении текстур вы назначаете каждой вершине полиона пару координат. Эти координаты (называемые координаты U, V) определяют точку внутри изображения текстуры. Координаты U, V являются аналогом координат X, Y изображения текстуры, но вместо того, чтобы указывать координаты основанные на ширине и высоте изображения текстуры в пикселях, вы задаете координаты в диапазоне от 0.0 до 1.0.

Как правило, координаты X и Y находятся в диапазоне от нуля до ширины и высоты изображения соответственно, так что если у вас есть изображение размером 640 × 480, X будет в диапазоне от 0 до 639, а Y — в диапазоне от 0 до 479. Для доступа к пикселю, находящемуся в середине изображения, вы указываете координаты X = 319 и Y = 239.

Координаты U и V находятся в диапазоне от 0 (верхний или левый край изображения) до 1 (правый или нижний край изображения), как показано на рис. 2.15. Для доступа к пикселю, находящемуся в центре изображения размером 640 × 480 точек, вы используете координаты U = 0.5 и V = 0.5.

Рис. 2.15. Координаты U и V для изображения текстуры остаются постоянными, независимо от размера изображения

На первый взгляд договоренность относительно координат U и V может показаться странной. Однако она замечательно работает, поскольку вы можете быстро заменить текстуру на новую другого размера и не беспокоиться об изменении координат.

СОВЕТ

Вот изящный трюк. Вы можете задавать для координат U и

 

V значения больше, чем 1.0. В результате при

 

визуализации текстура будет дублироваться. Например,

 

если вы зададите для координаты U значение 2.0, текстура

 

будет нарисована дважды, дублируясь по горизонтали.

 

Если задать для координаты U значение 3.0, текстура

 

будет отображена трижды. То же самое справедливо и для

 

координаты V.

 

 

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

110

netlib.narod.ru

Джим Адамс

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

Использование наложения текстур в Direct3D

Управление текстурами в Direct3D осуществляется через объект IDirect3DTexture9. Этот объект хранит информацию о текстуре и

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

Начав использовать текстуры, вы столкнетесь с некоторыми ограничениями, накладываемыми на них Direct3D и производителями видеокарт. Во-первых, ограничены размеры текстур, которые к тому же должны быть степенями двойки (например, 8, 32, 128 или 256). Обычно ширина текстуры равна ее высоте, то есть используются размеры 128 × 128 или 256 × 256. Будьте внимательны, поскольку при работе с трехмерной графикой здесь может крыться ловушка: некоторые видеокарты не позволяют применять текстуры, у которых высота отличается от ширины (то есть, размером 128 × 64 или 32 × 256), и большинство (на момент написания книги) не разрешают использовать текстуры, размеры которых не являются степенями двойки. Поэтому вы всегда должны стараться использовать текстуры у которых ширина равна высоте. Кроме того, вы должны гарантировать, что размеры ваших текстур не превышают 256 × 256, поскольку это максимальный размер текстур с которыми могут работать большинство видеокарт (а вы должны удостовериться, что ваша игра совместима с большей частью существующего оборудования).

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

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

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

netlib.narod.ru

111

HRESULT D3DXCreateTextureFromFile( IDirect3DDevice9 *pDevice,

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

СОВЕТ Чтобы уменьшить время инициализации, затрачиваемое видеокартой на подготовку текстуры, вы можете упаковать несколько изображений в одну текстуру. Сделав так, вы гарантируете, что подготовку текстуры необходимо будет выполнить только один раз; потом, по мере необходимости, отдельные изображения будут извлекаться из текстуры. Пример использования этой техники будет показан в книге.

Загрузка текстуры

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

Таблица 2.5. Функции загрузки текстур библиотеки D3DX

Функция

Описание

 

 

 

 

 

D3DXCreateTextureFromFile

Загружает текстуру из файла с растровыми

 

изображением

 

 

D3DXCreateTextureFromFileEx

Более

сложная

версия

функции

D3DXCreateTextureFromFile-

D3DXCreateTextureFromFile

 

Загружает текстуру из файла, который уже

InMemory

загружен в память

 

 

D3DXCreateTextureFromFile-

Более

сложная

версия

функции

InMemoryEx

D3DXCreateTextureFromFileInMemory

D3DXCreateTextureFromRe-

Загружает

изображение текстуры из

source

ресурсов приложения

 

 

D3DXCreateTextureFromRe-

Более

сложная

версия

функции

sourceEx

D3DXCreateTextureFromResource

Как видно в таблице 2.5, у каждой функции загрузки текстур есть две версии: одна быстрая и простая версия для загрузки текстур, и другая, с суффиксом Ex, более сложная, которая предоставляет больше контроля над

процессом создания текстуры. Одиссею с наложением текстур мы начнем со

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

D3DXCreateTextureFromFile:

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

LPCSTR pSrcFile, // Имя загружаемого файла // с изображением

IDirect3DTexture9 **ppTexture); // Создаваемый объект текстуры

И снова с функцией не сложно иметь дело; просто передайте ей ранее инициализированный объект устройства, имя файла с изображением,

112

netlib.narod.ru

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