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);