Доступ к содержимому буфера вершин (Direct3D 9)

Объекты буфера вершин позволяют приложениям напрямую обращаться к памяти, выделенной для данных вершин. Вы можете получить указатель на память буфера вершин, вызвав метод IDirect3DVertexBuffer9::Lock, а затем доступ к памяти при необходимости для заполнения буфера новыми данными вершин или для чтения данных, которые он уже содержит. Метод IDirect3DVertexBuffer9::Lock принимает четыре параметра. Первым является смещение OffsetToLockв данных вершин. Второй параметр — это размер, измеряемый в байтах данных вершин. Третий параметр, принятый, — это адрес указателя, который указывает на данные вершин, если вызов выполнен успешно.

Последний параметр, Флаги, указывает системе, как следует заблокировать память. Укажите константы для параметра Флаги в соответствии с способом доступа к данным вершин. Убедитесь, что значение, выбранное для 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 размер(DWORD)
D3DFVF_NORMAL sizeof(float) x 3
D3DFVF_SPECULAR sizeof(DWORD)
D3DFVF_TEXn sizeof(float) × n
D3DFVF_XYZ sizeof(float) x 3
D3DFVF_XYZRHW Размер (в байтах) числа с плавающей запятой (float) умножить на 4

 

Число координат текстур, присутствующих в формате вершины, описывается флагами D3DFVF_TEX n (где n — значение от 0 до 8). Умножьте количество наборов координат текстуры на размер одного набора координат текстуры, который может варьироваться от одного до четырех с плавающей запятой, чтобы вычислить память, необходимую для этого количества координат текстуры.

Используйте общий шаг вершины для увеличения и уменьшения указателя памяти по мере необходимости для доступа к определенным вершинам.

Получение описаний буфера вершин

Вы можете получить сведения о буфере вершин, вызвав метод IDirect3DVertexBuffer9::GetDesc. Этот метод заполняет элементы структуры D3DVERTEXBUFFER_DESC сведениями о буфере вершин.

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