Создание буферов вершин и индексов
3.1.1. Создание буферов вершин и индексов
Для создания буферов вершин и индексов используются следующие два метода:
HRESULT IDirect3DDevice9::CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle );
HRESULT IDirect3DDevice9::CreateIndexBuffer( UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle );
У обоих методов большая часть параметров идентична, так что рассмотрим параметры обоих методов вместе:
Length — Количество байт, выделяемых под буфер. Если нам требуется буфер достаточного размера для хранения восьми вершин, в этом параметре следует указать 8 * sizeof(Vertex), где Vertex — это ваша структура данных вершины.
Usage — Задает ряд дополнительных параметров, определяющих особенности использования буфера. Можно указать 0, если дополнительные параметры отсутствуют, или комбинацию из одного или нескольких следующих флагов:
D3DUSAGE_DYNAMIC — Флаг указывает, что данный буфер будет динамическим. Различия между статическими и динамическими буферами мы обсудим чуть позже.
D3DUSAGE_POINTS — Флаг указывает, что буфер будет использовваться для хранения примитивов точек. Примитивы точек рассматриваются в главе 14. Этот флаг может применяться только для буферов вершин.
D3DUSAGE_SOFTWAREPROCESSING — Обработка вершин будет выполняться программно.
D3DUSAGE_WRITEONLY — Указывает, что приложение может только записывать данные в буфер. Это позволяет драйверу разместить буфер в области памяти, обеспечивающей максимальную скорость записи. Обратите внимание, что попытка прочитать данные из буфера, созданного с указанием этого флага, приведет к ошибке.
FVF — Настраиваемый формат вершин, которые будут храниться в создаваемом буфере вершин.
Pool — Пул памяти, в котором будет размещен буфер.
ppVertexBuffer — Адрес ля возврата указателя на созданный буфер вершин.
pSharedHandle — Не используется, должен быть равен 0.
Format — Задает размер индексов; используйте D3DFMT_INDEX16 для 16-разрядных индексов или D3DFMT_INDEX32 для 32-разрядных индексов. Обратите внимание, что не все устройства поддерживают 32-разрядные индексы, не забывайте проверять возможности устройства.
ppIndexBuffer — Адрес для возврата указателя на созданный буфер индексов.
ПРИМЕЧАНИЕ
Буфер, созданный без указания флага D3DUSAGE_DYNAMIC называется статическим буфером. Обычно статический буфер располагается в видеопамяти, где его содержимое может обрабатываться более эффективно. Однако, если вы сделаете буфер статическим, придется расплачиваться исключительно низкой скоростью записи в буфер и чтения из него. Поэтому мы будем использовать статические буферы для хранения статических данных (данных, которые не надо часто изменять). Хорошими кандидатами на размещение в статическом буфере являются ландшафты и здания, поскольку их геометрия обычно не изменяется во время работы приложения. Данные геометрии должны заноситься в статические буферы во время инициализации приложения, а не во время его работы. |
ПРИМЕЧАНИЕ
Буфер, созданный с указанием флага D3DUSAGE_DYNAMIC называется динамическим буфером. Динамические буферы обычно располагаются в памяти AGP, где их содержимое может достаточно быстро обновляться. Видеокарта работает с динамическими буферами медленнее, чем со статическими, потому что данные перед визуализацией должны быть переданы из буфера в видеопамять. Главное преимущество динамических буферов — возможность быстрого обновления (быстрая запись данных центральным процессором). Следовательно, если вам надо часто изменять содержимое буфера, сделайте его динамическим. Хорошим кандидатом на размещение в динамическом буфере являются системы частиц, поскольку они анимируются и их геометрия обычно изменяется в каждом кадре. |
ПРИМЕЧАНИЕ
Чтение данных из видеопамяти или из памяти AGP выполняется очень медленно.Следовательно, если вам во время работы приложения надо читать данные геометрии, лучше всего создать копию данных в системной памяти и обращаться для чтения к ней. |
В приведенном ниже фрагменте кода создается статический буфер вершин в котором можно хранить до восьми вершин типа Vertex.
IDirect3DVertexBuffer9* vb; _device->CreateVertexBuffer( 8 * sizeof(Vertex), 0, D3DFVF_XYZ, D3DPOOL_MANAGED, &vb, 0);
Следующий фрагмент кода показывает как создать динамический буфер индексов, в котором можно хранить до 36 16-разрядных индексов.
IDirect3DIndexBuffer9* ib; _device->CreateIndexBuffer( 36 * sizeof(WORD), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &ib, 0);
Все публикации раздела