繁体   English   中英

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

[英]Pass array of Java vertex objects to OpenGL entry points

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

在iOS上的标准工作流中,我会将顶点信息存储在一系列结构中:

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

Vector3 verts[];

之类的东西。

然后,当需要将我的顶点数据发送到GL时,我将指向verts数组,并将其视为浮点数组。

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

如何在Java中执行此操作?

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

按照您的方向,我认为这不能直接起作用。 当您在Java中拥有一个对象数组(例如Vector3类的数组)时,该数组包含对这些对象的引用序列 ,并且每个对象都分配在单独的内存块中。

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

您有多种选择:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM