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

Джим Адамс

ПРИМЕЧАНИЕ Флаг D3DCLEAT_TARGET используется чтобы сообщить

Direct3D, что именно вы хотите очистить (экран или окно). Есть несколько доступных для использования полезных флагов и с некоторыми из них вы вскоре познакомитесь.

Начало и завершение сцены

Перед тем, как вы будете что-либо визуализировать, необходимо сообщить

Direct3D о том, что надо подготовиться к визуализации. Для этой цели используется функция IDirect3DDevice::BeginScene (у которой нет

параметров):

HRESULT IDirect3DDevice9::BeginScene();

Когда вы завершаете визуализацию сцены, вам необходимо уведомить об этом Direct3D, воспользовавшись функцией EndScene:

HRESULT IDirect3DDevice9::EndScene();

Вы не должны помещать вызов функции Clear между BeginScene и EndScene; эта функция должна вызываться до BeginScene. Между

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

Визуализация полигонов

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

Вы рисуете объект IDirect3DVertexBuffer9 с помощью

следующей функции (конечно, после того как вы установили источник данных вершин и задали их формат):

HRESULT IDirect3DDevice9::DrawPrimitive(

D3DPRIMITIVETYPE

PrimitiveType,

// Рисуемые примитивы

UINT

StartVertex,

// Начальная вершина (0)

UINT

PrimitiveCount);

// Количество рисуемых примитивов

Первый параметр, PrimitiveType, сообщает Direct3D какие именно

фигуры надо рисовать (список некоторых из них приведен в таблице 2.4). Параметр StartVertex позволяет указать, с какой именно вершины

следует начать рисование (обычно указывается 0). В параметре PrimitiveCount вы указываете сколько именно примитивов (полигонов)

следует нарисовать.

Используемый тип примитива зависит от того, как вы заполняли буфер

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

netlib.narod.ru

107

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

эффективный способ, например, полосу треугольников, укажите тип

D3DPT_TRIANGLESTRIP.

Таблица 2.4. Типы примитивов в параметре DrawPrimitive

Тип

Описание

 

 

D3DPT_POINTLIST

Рисуем все вершины как пикселы

D3DPT_LINELIST

Рисуем набор изолированных линий, каждая из

 

которых использует две вершины

D3DPT_LINESTRIP

Рисуем набор линий, каждая из которых (кроме

 

первой) связана с предыдущей

D3DPT_TRIANGLELIST

D3DPT_TRIANGLESTRIP

D3DPT_TRIANGLEFAN

Рисуем отдельные полигоны, используя три вершины для каждого из них

Рисуем полосу треугольников, используя для первого из них три вершины, а для каждого последующего — две вершины из предыдущего треугольника и одну дополнительную

Рисуем веер из полигонов, используя первую вершину в качестве центра (все остальные полигоны присоединены к ней)

Следует помнить только об одной вещи — перед тем, как

визуализировать полигоны, вы должны начать сцену с помощью функции

IDirecr3DDevice9::BeginScene; иначе вызов функции

DrawPrimitive приведет к ошибке.

Предположим, вы создали буфер вершин, содержащий шесть вершин,

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

также установкой источника данных вершин и формата данных вершин) будет выглядеть примерно так:

// g_pD3DDevice

= ранее

инициализированный

объект устройства

// pD3DVB

= ранее

инициализированный

буфер вершин

//

sVertex

=

ранее

созданная структура данных вершины

//

VertexFVF

=

ранее

объявленный дескриптор FVF

// Устанавливаем источник потока данных и шейдер g_pD3DDevice->SetStreamSource(0, pD3DVB, 0, sizeof(sVertex)); g_pD3DDevice->SetFVF(VertexFVF);

if(SUCCEEDED(g_pD3DDevice->BeginScene())) {

// Визуализируем полигоны if(FAILED(g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2))) {

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

}

// Завершаем сцену g_pD3DDevice->EndScene();

}

108

netlib.narod.ru

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