2010-09-25 10 views
6

¿Es posible usar datos de vértice intercalados en OpenGL ES en Android?Compensaciones por datos de vértice intercalados en OpenGL ES en Android

No puedo obtener los punteros de desplazamiento correctos para los miembros normal y color.

En C++ me gustaría hacer algo como esto:

struct ColoredVertexData3D{ 
    Vertex3D vertex; 
    Vector3D normal; 
    ColorRGBA color; 
}; 

const ColoredVertexData3D vertexData[] = 
{ 
    { 
     {0.0f, 0.5f, 0.8f},  // Vertex | 
     {0.0f, 0.4f, 0.6f},  // Normal | Vertex 0 
     {1.0f, 0.0f, 0.0f, 1.0f} // Color | 
    }, 
    { 
     {0.8f, 0.0f, 0.5f},  // Vertex | 
     {0.6f, 0.0f, 0.4f},  // Normal | Vertex 1 
     {1.0f, 0.5f, 0.0f, 1.0f} // Color | 
    }, 
    // ... more vertexes. 
}; 

const int stride = sizeof(ColoredVertexData3D); 
glVertexPointer(3, GL_FLOAT, stride, &vertexData[0].vertex); 
glColorPointer(4, GL_FLOAT, stride, &vertexData[0].color); 
glNormalPointer(GL_FLOAT, stride, &vertexData[0].normal); 

es lo mismo que sea posible en Android en Java? Esto es lo que tengo actualmente:

ByteBuffer vertexData = ...; 
int stride = 40; 

gl.glVertexPointer(3, GL10.GL_FLOAT, stride, vertexData); 

// This obviously doesn't work. ------------v 
gl.glColorPointer(4, GL10.GL_FLOAT, stride, &vertexData[0].color); 
gl.glNormalPointer(GL10.GL_FLOAT, stride, &vertexData[0].normal); 

Respuesta

6

La idea básica es llamar duplicado() en el ByteBuffer, lo que crea un nuevo ByteBuffer que comparte el almacenamiento subyacente pero le permite comenzar en una posición diferente.

Esto es lo que funcionó para mí:

FloatBuffer verticesNormals; 
// ... code to initialize verticesNormals ... 
// verticesNormals contains 6 floats for each vertex. The first three 
// define the position and the next three define the normal. 

gl.glVertexPointer(3, gl.GL_FLOAT, 24, verticesNormals); 

// Create a buffer that points 3 floats past the beginning. 
FloatBuffer normalData = mVerticesNormals.duplicate(); 
normalData.position(3); 

gl.glNormalPointer(gl.GL_FLOAT, 24, normalData); 
+0

bien, interesante. No sabía que la llamada 'FloatBuffer.duplicate' compartía los datos, pensé que había creado una copia profunda. – dalle

Cuestiones relacionadas