Compartir a través de


Obtener acceso al contenido de un búfer de vértices (Direct3D 9)

Los objetos de búfer de vértices permiten a las aplicaciones acceder directamente a la memoria asignada para los datos de vértices. Puede recuperar un puntero a la memoria del búfer de vértices llamando al método IDirect3DVertexBuffer9::Lock y, a continuación, accediendo a la memoria según sea necesario para rellenar el búfer con nuevos datos de vértices o para leer los datos que ya contiene. El método IDirect3DVertexBuffer9::Lock acepta cuatro parámetros. El primero, OffsetToLock, es el desplazamiento en los datos del vértice. El segundo parámetro es el tamaño, medido en bytes, de los datos de vértices. El tercer parámetro aceptado es la dirección de un puntero que apunta a los datos de vértices, si la llamada se realiza correctamente.

El último parámetro, Flags, indica al sistema cómo se debe bloquear la memoria. Especifique constantes para el parámetro Flags según la forma en que se accederá a los datos del vértice. Asegúrese de que el valor elegido para D3DUSAGE coincide con el valor elegido para D3DLOCK. Por ejemplo, si va a crear un búfer de vértices solo con acceso de escritura, no tiene sentido intentar leer los datos especificando D3DLOCK_READONLY. El uso prudente de estas marcas permite al controlador bloquear la memoria y proporcionar el mejor rendimiento, dado el tipo de acceso solicitado.

Cuando termine de rellenar o leer los datos de vértices, llame al método IDirect3DVertexBuffer9::Unlock , como se muestra en el ejemplo de código siguiente.

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

Si crea un búfer de vértices con la marca D3DUSAGE_WRITEONLY, no use la marca de bloqueo D3DLOCK_READONLY. Use la marca D3DLOCK_READONLY si la aplicación solo leerá de la memoria del búfer de vértices. Incluir esta marca permite a Direct3D optimizar sus procedimientos internos para mejorar la eficacia, dado que el acceso a la memoria será de solo lectura.

Vea Usar vértices dinámicos e búferes de índice para obtener información sobre el uso de D3DLOCK_DISCARD o D3DLOCK_NOOVERWRITE para el parámetro Flags de IDirect3DVertexBuffer9::Lock.

En C++, dado que accede directamente a la memoria asignada para el búfer de vértices, asegúrese de que la aplicación accede correctamente a la memoria asignada. De lo contrario, corre el riesgo de representar esa memoria no válida. Use el intervalo del formato de vértice que usa la aplicación para pasar de un vértice del búfer asignado a otro. La memoria del búfer de vértices es una matriz simple de vértices especificados en FVF. Use el intervalo de la estructura de formato de vértice que defina. Puede calcular el intervalo de cada vértice en tiempo de ejecución examinando el D3DFVF contenido en la descripción del búfer de vértices. En la tabla siguiente se muestra el tamaño de cada componente de vértice.

Marca de formato de vértice Size
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

 

El número de coordenadas de textura presentes en el formato de vértice se describe mediante las marcas D3DFVF_TEX n (donde n es un valor comprendido entre 0 y 8). Multiplique el número de conjuntos de coordenadas de textura por el tamaño de un conjunto de coordenadas de textura, que puede oscilar entre uno y cuatro flotantes, para calcular la memoria necesaria para ese número de coordenadas de textura.

Use el intervalo total de vértices para incrementar y disminuir el puntero de memoria según sea necesario para acceder a determinados vértices.

Recuperar descripciones del búfer de vértices

Puede recuperar información sobre un búfer de vértices llamando al método IDirect3DVertexBuffer9::GetDesc . Este método rellena los miembros de la estructura D3DVERTEXBUFFER_DESC con información sobre el búfer de vértices.

Búferes de vértices