将Java顶点对象数组传递给OpenGL入口点

时间:2014-10-03 18:51:40

标签: java android arrays opengl-es-2.0

我开始将我的游戏从iOS移植到Android,我遇到了问题。

在iOS上的标准工作流程中,我将顶点信息存储在一个结构数组中:

typedef struct{
    float x, y, z;
} Vector3;

Vector3 verts[];

那种事。

然后,当我将顶点数据发送到GL时,我只会指向顶点数组,它会将它视为一个浮点数组。

glVertexAttribPointer(Vertex_POSITION, 3, GL_FLOAT, 0, 0, (void *)verts);

我如何用Java做到这一点?

我尝试制作一个Vector3类并将其中的一些放入数组中,但是当我尝试将该数组填充到GL中时会抛出错误。

1 个答案:

答案 0 :(得分:1)

根据你的方向,我不认为这可以直接起作用。当你有一个Java对象数组(就像你的Vector3类的数组)时,数组包含一个引用序列到这些对象,并且每个对象都分配在一个单独的块中记忆。

您需要传递给glVertexAttribPointer()glBufferData()等OpenGL入口点的是包含数据的连续内存块。一组对象没有该布局,因此根本无法直接使用它。

您有多种选择:

  • 不要使用对象数组来存储数据。而是使用将数据存储在连续内存块中的数据结构。对于浮点值,可以是float[]FloatBuffer。 Android中的Java入口点将缓冲区作为参数,因此使用缓冲区是最直接的方法。您应该能够在Android OpenGL示例中找到大量示例。
  • 在进行API调用之前将数据复制到临时缓冲区。这显然不是很吸引人,因为额外的数据副本会导致非生产性开销。
  • 用C ++编写OpenGL代码,并用NDK编译。如果您从另一个平台移植C ++代码,这也可能为您节省大量工作。如果你在iOS上将OpenGL代码与Objective-C混合在一起,它仍然需要工作。