Подготовка к рисованию
Создав буфер вершин и, возможно, буфер индексов мы уже почти готовы к визуализации их содержимого, но сперва надо выполнить несколько подготовительных действий.
Установка источника потоковых данных. Эта операция подключает буфер вершин к потоку, основная задача которого — снабжение конвейера визуализации данными о геометрии.
Для установки источника потоковых данных используется следующий метод:
HRESULT IDirect3DDevice9::SetStreamSource( UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride );
StreamNumber — Идентифицирует поток, к которому мы будем подключать буфер вершин. В этой книге мы не используем несколько потоков, так что значение данного параметра всегда будет равно нулю.
pStreamData — Указатель на буфер вершин,который мы хотим подключить к потоку.
OffsetInBytes — Измеренное в байтах смещение от начала потока, задающее начало данных вершин, которые будут переданы в конвейер визуализации. Если вы собираетесь указывать отличное от нуля значение, убедитесь, что устройство поддерживает данную возможность, проверив установлен ли флаг D3DDEVCAPS2_STREAMOFFSET в структуре D3DCAPS9.
Stride — Размер в байтах каждого элемента того буфера вершин, который мы подключаем к потоку.
Предположим, что vb — это буфер вершин, заполненный данными вершин типа Vertex. В этом случае обращение к методу будет выглядеть так:
_device->SetStreamSource(0, vb, 0, sizeof(Vertex));
Задание формата вершин. Здесь мы указываем формат вершин, который будет использоваться в дальнейших вызовах функций рисования.
_device->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
Задание буфера индексов. Если мы используем буфер индексов, то должны указать тот буфер индексов, который будет использоваться в последующих операциях рисования. Одновременно может использоваться только один буфер индексов; следовательно, если вам потребуется нарисовать объект с использованием другого буфера индексов, надо будет переключиться на другой буфер. Задание буфера индексов выполняет следующий фрагмент кода:
_device->SetIndices(_ib); // передаем копию указателя на буфер индексов