【问题标题】:Pass array of Java vertex objects to OpenGL entry points将 Java 顶点对象数组传递给 OpenGL 入口点
【发布时间】:2014-10-04 15:15:20
【问题描述】:

我开始将我的游戏从 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 时它会引发错误。

【问题讨论】:

  • AFAIK 一个浮点数组应该就可以了。
  • These questions 使用GL_FLOAT[] 或FloatBuffer 显示;我自己也不知道。
  • 那么在Java中没有办法做到这一点吗?我在 iOS 中执行此操作的方式的好处在于,它更容易、更有效地获取和设置值。
  • 我有点困惑浮点数组比对结构的引用更复杂(或者一个类的数组只不过是你尝试过的一些浮点数)。它抛出的错误是什么?
  • but it throws an error 是你的问题,但你没有说问题是什么。有很多方法可以解决这个问题,一个 Vector3 列表就可以了。

标签: java android arrays opengl-es-2.0


【解决方案1】:

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

您需要传递给 OpenGL 入口点(如 glVertexAttribPointer() 或 glBufferData())的是包含数据的连续内存块。对象数组没有这种布局,所以根本不可能直接使用它。

您有多种选择:

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

【讨论】:

  • 看来我可能不得不走 NDK 路线。无论如何,我的大部分代码都是标准 C 语言,所以实现它应该不会太难。我很惊讶Java没有结构......我发现这种数据存储方式非常有用。任何人,谢谢伙计!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多