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

3.4. Рисование с буферами вершин и индексов

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

3.4.1. IDirect3DDevice9::DrawPrimitive

Данный метод используется для рисования примитивов не использующих индексы.

HRESULT IDirect3DDevice9::DrawPrimitive(
     D3DPRIMITIVETYPE PrimitiveType,
     UINT StartVertex,
     UINT PrimitiveCount
);

А вот и пример использования метода:

// рисуем четыре треугольника
_device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

3.4.2. IDirect3DDevice9::DrawIndexedPrimitive

Этот метод используется для рисования примитивов, использующих индексы.

HRESULT IDirect3DDevice9::DrawIndexedPrimitive(
     D3DPRIMITIVETYPE Type,
     INT BaseVertexIndex,
     UINT MinIndex,
     UINT NumVertices,
     UINT StartIndex,
     UINT PrimitiveCount
);

Пример использования метода:

_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);

 

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

Рис. 3.2. Объединение раздельно объявленных буферов вершин в один общий буфер вершин

Рис. 3.2. Объединение раздельно объявленных буферов вершин в один общий буфер вершин

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

И последний фрагмент информации: помните, что все вызовы методов рисования должны находиться внутри пары вызовов IDirect3DDevice9::BeginScene и IDirect3DDevice9::EndScene. К примеру, следует писать:

_device->BeginScene();
     _device->DrawPrimitive(...);
_device->EndScene();

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

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