【发布时间】:2009-08-07 05:46:12
【问题描述】:
在与一些同事讨论时,我们想知道为 Android 或 iPhone 开发的 OpenGL 工作是否可以有效地互换,因为两者都支持该规范。
或者,在两个平台之间共享 OpenGL 的现实更多的是一种怪癖、调整,并且不像人们希望的那样容易。
【问题讨论】:
在与一些同事讨论时,我们想知道为 Android 或 iPhone 开发的 OpenGL 工作是否可以有效地互换,因为两者都支持该规范。
或者,在两个平台之间共享 OpenGL 的现实更多的是一种怪癖、调整,并且不像人们希望的那样容易。
【问题讨论】:
OpenGL 实现通常由两部分组成: 1.平台特定部分。这具有通常与创建和显示表面相关的功能。 2. OpenGL API。这部分对于OpenGL的具体实现在所有平台都是一样的,以Android为例,OpenGLES 1.0。
这意味着您的大部分 OpenGL 代码应该易于移植。
在 C 中,您可能有 glLoadIdentity();
在 Android 上的 Java 中,类似 gl.glLoadIdentity();
因此,对于大部分代码,您可以剪切和粘贴,然后搜索和替换像“gl”这样的前缀。
现在是有趣的部分:您确实需要小心您编码的版本。用于桌面的 OpenGL 具有 OpenGLES 中不存在的 API。还有一些特定于每个平台的 OpenGL 数据类型。此外,您还有 1.0(例如 Android)1.1(例如 iPhone)2.0(例如 iPhone GS)要处理。 API 的差异通常与额外的硬件功能有关,因此您无法编写一些简单的包装器代码来模拟 1.0/1.1 中的 2.0 功能。
【讨论】:
Android 上的 OpenGL ES 是根据 Khronos Java GLES 规范 JSR239 完成的,并将 GL 调用包装在类似 glinst.glBindBuffer(FloatBuffer.wrap(data) ... ) 中 iPhone 上的 OpenGL ES 是使用库存 GL.h 文件完成的,同样的调用看起来就像 glBindBuffer(data...)
代码将不可互换,并会导致许多怪癖,甚至在您了解 1.0 1.1 和 2.0 API 之间的所有差异之前。
【讨论】:
两个平台都使用 OpenGL ES,但 Wikipedia 声称 Android 使用 1.0,而 iPhone 使用 1.1(原始和 3g)和 3gs link 的 2.0。很可能至少有些程序会使用1.0中不包含的api函数,因此两者之间不会完全兼容(以及3)。
【讨论】: