Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android上OpenGL ES中交错的逐顶点数据偏移量_Java_Android_Opengl Es - Fatal编程技术网

Java Android上OpenGL ES中交错的逐顶点数据偏移量

Java Android上OpenGL ES中交错的逐顶点数据偏移量,java,android,opengl-es,Java,Android,Opengl Es,是否可以在Android上使用OpenGL ES中交错的逐顶点数据 我无法为normal和color成员获取正确的偏移指针 在C++中,我会做这样的事情:< /P> struct ColoredVertexData3D{ Vertex3D vertex; Vector3D normal; ColorRGBA color; }; const ColoredVertexData3D vertexData[] = { { {0.0f,

是否可以在Android上使用OpenGL ES中交错的逐顶点数据

我无法为
normal
color
成员获取正确的偏移指针

在C++中,我会做这样的事情:< /P>
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);
同样的事情在Java的Android上也可能发生吗?这是我目前得到的:

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

基本思想是对ByteBuffer调用duplicate(),这将创建一个新的ByteBuffer,它共享底层存储,但允许您从不同的位置开始

以下是对我有效的方法:

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

好的,很有趣。我不知道
FloatBuffer.duplicate
调用共享了数据,我认为它创建了一个深度副本。