Поделиться через


Доступ к содержимому буфера вершин (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 сведениями о буфере вершин.

Буферы вершин