Введение в программирование трехмерных игр с DX9

       

IDXBuffer


В предыдущей главе мы упомянули интерфейс ID3DXBuffer, но подробно его не обсуждали. При работе с библиотекой D3DX мы будем часто сталкиваться с этим интерфейсом, так что имеет смысл познакомиться с ним поближе.

Интерфейс ID3DXBuffer представляет собой структуру данных общего назначения, которую библиотека D3DX использует для хранения данных в непрерывном блоке памяти. У интерфейса всего два метода:

LPVOID GetBufferPointer() — Возвращает указатель на начало области с данными.

DWORD GetBufferSize() — Возвращает размер буфера в байтах.

Чтобы структуру можно было применять для любых данных, используются указатели типа void. Это означает, что при получении хранящихся в буфере данных необходимо выполнять приведение типа. Например, функция D3DXLoadMeshFromX использует ID3DXBuffer чтобы возвратить информацию о смежности граней сетки. Поскольку данные о смежности граней хранятся в массиве значений типа DWORD, то, когда мы хотим использовать хранящуюся в буфере информацию о смежности граней, нам надо выполнить приведение типа буфера к массиву DWORD.

Вот пара примеров:

DWORD* info =(DWORD*)adjacencyInfo->GetBufferPointer(); D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();

Поскольку ID3DXBuffer это COM-объект, после завершения работы с ним его следует освободить, чтобы не было утечек памяти:

adjacencyInfo->Release(); mtrlBuffer->Release();

Мы можем создать пустой буфер ID3DXBuffer с помощью следующей функции:

HRESULT D3DXCreateBuffer( DWORD NumBytes, // Размер буфера в байтах LPD3DXBUFFER *ppBuffer // Возвращает указатель на буфер );

Приведенный ниже фрагмент кода создает буфер для хранения четырех целых чисел:

ID3DXBuffer* buffer = 0; D3DXCreateBuffer(4 * sizeof(int), &buffer);



Содержание раздела