2010-09-25 17 views
6

Android上的OpenGL ES中的每个顶点数据是否可以使用交错?在Android上的OpenGL ES中交错的每个顶点数据的偏移量

我无法获得normalcolor成员的正确偏移指针。

在C++中,我会做这样的事情:

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

是同样的事情可能在Android上使用Java?这是我目前得到:

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

回答

6

的基本思想是调用字节缓冲区,它会创建一个共享底层存储,但是允许你在不同的位置开始新的字节缓冲区重复()。

下面是我工作:

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

好了,有意思。不知道“FloatBuffer.duplicate”调用共享数据,我认为它创建了一个深层副本。 – dalle 2011-01-20 17:15:11