我计划编写一个可在 PC 和 Android 上运行的 Java 3D 游戏。不幸的是,这两个平台似乎都没有通用的 OpenGL API。
API 是否有显着差异?有没有办法可以在两个版本中使用相同的 3D 代码?这是个好主意吗?
Android 支持与 OpenGL 1.3 重叠的 OpenGL ES 1.0,所以这应该是可能的,但它并不像在运行时替换 jar 文件那么简单。
尝试在两个平台上尽可能多地重用您的应用程序是一个好主意。无论如何,即使您并不特别需要 OpenGL ES 支持,将其余代码与外部依赖项(如 OpenGL)隔离开来通常是一种好习惯。您永远不知道将来您可能希望将应用程序移植到哪个 API/平台。
有 2 个选项可用。
第一种是将 OpenGL 实现隐藏在应用程序其余部分使用的接口后面,然后提供单独的 Jogl 和 Androide 实现。根据您运行的平台,您可以选择使用工厂模式在运行时实例化正确的实现。
由于 OpenGL ES 和 OpenGL 非常相似,只要您坚持常用功能,维护它所需的工作量不应太高。
另一种选择是尝试使用支持配置文件的 Jogl2。这些似乎可以提供您所需要的,但 Jogl2 仍处于测试阶段。
这个页面的底部讨论了一些关于个人资料的内容:http: //kenai.com/projects/jogl/pages/FAQ
配置文件允许以允许同时兼容多个 OpenGL 版本的方式编写 Java 应用程序。由于 OpenGL ES(用于嵌入式系统的 GL)与 OpenGL 本身具有重叠的功能,因此它提供了添加连接桌面和嵌入式实现的配置文件的机会。
您可能想阅读此http://michael-bien.com/mbien/entry/jogl_2_opengl_profiles_explained以了解有关配置文件的更多信息。
该项目已完成。事实证明,API 有所不同,但在功能上存在共享部分。我们最终编写了一个简单的预处理器,将 JOGL 代码转换为 ES 版本,并使用 Eclipse 自动转换。
由于 JOGL-ES 几年前被合并到 JOGL 2.x 中,您现在可以在桌面和移动环境 (Android) 中使用 JOGL。
java3d 和 android opengl api 之间实际上存在相当大的差异。首先 java3d 是对 3d 的更高层次的抽象。即使您要使用类似 JOGL 的东西,api 也会有一些差异。您最好的选择是在代码库中抽象出实际的 3d 绘图实现,您可以共享其余的逻辑,然后使用特定于平台的代码来处理 opengl/3d 绘图。