Меши, вершинные и индексные буферы в DirectX9

Статья запоздала на лет эдак на 15, если не на 18. Но все же в 2019 году на DirectX9 еще можно писать игры.

Рассмотрим функцию CreateVertexBuffer:

HRESULT CreateVertexBuffer(
[in] UINT Length,
[in] DWORD Usage,
[in] DWORD FVF,
[in] D3DPOOL Pool,
[out, retval] IDirect3DVertexBuffer9 **ppVertexBuffer,
[in] HANDLE *pSharedHandle
);

Пройдемся по параметрам функции, в чем нам поможет документация по DirectX9 SDK.

Length

Параметр Length, как сказано в документации, должен содержать размер вершинного буфера в байтах. Тут сказано также, что для вершинных буферов FVF длина буфера должна быть достаточно большой, чтобы в буфер могла поместиться по крайней мере одна вершина. При этом, необязательно, чтобы длина буфера была кратна размеру одной вершины. То есть якобы, можно впихнуть в буфер столько вершин, сколько в него влезет и еще может остаться пара-тройка свободных байт. Это все справедливо для FVF-буфера. Что же такое FVF вершинный буфер? В документации сказано:

«Установка значения, отличного от нуля и являющегося допустимым FVF кодом,  параметру FVF в методе IDirect3DDevice9::CreateVertexBuffer, указывает на то, что о содержимом буфера вершин можно судить по FVF кодам. Вершинный буфер, который создан с кодом FVF, называется вершинным буфером FVF».

Возвращаясь к описанию параметра «Length», дополню, что длина не-FVF буфера не проверяется.

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

Length = nVertices * vertexSize.

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

Usage

Тип использования. Тип использования чего? Рассуждая логически, можно заключить, что речь идет о типе использования буфера вершин. Ведь термин буфер в программировании означает нечто вроде куска памяти. А вот интерпретация содержимого буфера, т. е. то, как его будут использовать, зависит от программиста. В DirectX 9 тип использования вершинного буфера можно задать в виде константных макросов, имя которых начинается с префикса «D3DUSAGE_». Внимание! Не все такие макросы применимы к вершинному буферу — есть соответствующая таблица, где указано, какие макросы для каких типов ресурса можно использовать. Вершинный буфер — это один из типов ресурса DirectX 9. Посмотрим на эти макросы.

D3DUSAGE_DONOTCLIP — «установить этот флаг для указания того, что содержимое вершинного буфера никогда не нужно обрезать. При рендеринге буфера, у которого установлен этот флаг, нужно установить состояние рендера D3DRS_CLIPPING в false». Немного непонятно, что значит «обрезать содержимое буфера». Из того, что я прочитал и понял в документации DirectX 9 SDK, вершинный буфер может хранить флаги отсечения тех вершин, которые не попадают в поле зрения. Флаги отсечения занимают дополнительную память, делая буфер вершин, который способен хранить подобную информацию, несколько более объемным, чем буфер вершин, который не способен нести информацию об отсечении вершин. Флаг D3DUSAGE_DONOTCLIP запрещает сопровождать вершинный буфер информацией об отсечении вершин. Такой флаг может применяться в параметре Usage только тогда, когда указано, что буфер вершин будет содержать трансформированные вершины, для чего параметр FVF должен содержать код D3DFVF_XYZRHW.

Что значит «трансформированные вершины»? Продолжение следует…

 

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s