Доступ к содержимому буфера вершин (Direct3D 9)
Объекты буфера вершин позволяют приложениям напрямую обращаться к памяти, выделенной для данных вершин. Вы можете получить указатель на память буфера вершин, вызвав метод IDirect3DVertexBuffer9::Lock , а затем при необходимости получить доступ к памяти для заполнения буфера новыми данными вершин или чтения всех данных, которые он уже содержит. Метод IDirect3DVertexBuffer9::Lock принимает четыре параметра. Первый, OffsetToLock, — это смещение данных вершины. Второй параметр — это размер данных вершины, измеряемый в байтах. Третий допустимый параметр — это адрес указателя, который указывает на данные вершины, если вызов выполнен успешно.
Последний параметр Flags сообщает системе, как должна быть заблокирована память. Укажите константы для параметра Flags в соответствии с способом доступа к данным вершины. Убедитесь, что значение, выбранное для D3DUSAGE , совпадает со значением, выбранным для D3DLOCK. Например, если вы создаете буфер вершин только с доступом на запись, нет смысла пытаться прочитать данные, указав D3DLOCK_READONLY. Разумное использование этих флагов позволяет драйверу заблокировать память и обеспечить наилучшую производительность с учетом запрошенного типа доступа.
Завершив заполнение или чтение данных вершин, вызовите метод IDirect3DVertexBuffer9::Unlock , как показано в следующем примере кода.
// This code example assumes the g_pVB is a variable of type
// LPDIRECT3DVERTEXBUFFER9 and that g_Vertices has been
// properly initialized with vertices
// Lock the buffer to gain access to the vertices
VOID* pVertices;
if(FAILED(g_pVB->Lock(0, sizeof(g_Vertices),
(BYTE**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy(pVertices, g_Vertices, sizeof(g_Vertices));
g_pVB->Unlock();
При создании буфера вершин с флагом D3DUSAGE_WRITEONLY не используйте флаг блокировки D3DLOCK_READONLY. Используйте флаг D3DLOCK_READONLY, если приложение будет считывать только из памяти буфера вершин. Включение этого флага позволяет Direct3D оптимизировать свои внутренние процедуры для повышения эффективности, учитывая, что доступ к памяти будет доступен только для чтения.
Сведения об использовании D3DLOCK_DISCARD или D3DLOCK_NOOVERWRITE для параметра Flags IDirect3DVertexBuffer9::Lock см. в разделе Использование динамических буферов вершин и индексов.
Так как в C++ вы напрямую обращаетесь к памяти, выделенной для буфера вершин, убедитесь, что приложение правильно обращается к выделенной памяти. В противном случае вы рискуете сделать эту память недопустимой. Используйте шаг формата вершин, используемый приложением для перемещения от одной вершины в выделенном буфере к другой. Память буфера вершин представляет собой простой массив вершин, указанных в FVF. Используйте шаг любой определяемой структуры формата вершины. Вы можете вычислить шаг каждой вершины во время выполнения, изучив D3DFVF , содержащийся в описании буфера вершин. В следующей таблице показан размер каждого компонента вершины.
Флаг формата вершин | Размер |
---|---|
D3DFVF_DIFFUSE | sizeof(DWORD) |
D3DFVF_NORMAL | sizeof(float) x 3 |
D3DFVF_SPECULAR | sizeof(DWORD) |
D3DFVF_TEXn | sizeof(float) x n |
D3DFVF_XYZ | sizeof(float) x 3 |
D3DFVF_XYZRHW | sizeof(float) x 4 |
Число координат текстуры, присутствующих в формате вершины, описывается флагами D3DFVF_TEX n (где n — это значение от 0 до 8). Умножьте количество наборов координат текстуры на размер одного набора координат текстуры, который может варьироваться от одного до четырех значений с плавающей точкой, чтобы вычислить объем памяти, необходимый для этого количества координат текстуры.
Используйте общий шаг вершины для увеличения и уменьшения указателя памяти по мере необходимости для доступа к определенным вершинам.
Получение описаний буфера вершин
Сведения о буфере вершин можно получить, вызвав метод IDirect3DVertexBuffer9::GetDesc . Этот метод заполняет элементы структуры D3DVERTEXBUFFER_DESC сведениями о буфере вершин.
Связанные темы