使用 JOGL 和 Android OpenGL 编写可移植 Java 应用程序
题
我计划编写一款可以在 PC 和 Android 上运行的 Java 3D 游戏。不幸的是,这两个平台似乎没有通用的 OpenGL API。
API 是否有显着差异?有没有办法在两个版本中使用相同的 3D 代码?这是不是一个好主意?
解决方案
Android 支持 OpenGL ES 1.0,它与 OpenGL 1.3 重叠,因此这应该是可能的,但它并不像在运行时替换 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自动完成转换。
java3d和android opengl api之间确实存在很大差异。第一个java3d是3d上的更高级抽象。即使你使用像JOGL这样的东西,api也会有一些不同之处。你最好的选择是在代码库中抽象出实际的3D绘图实现,你可以共享其余的逻辑,但是然后有特定于平台的代码来处理opengl / 3d绘图。
几年前,当JOGL-ES合并到JOGL 2.x中时,您现在可以在桌面和移动环境(Android)中使用JOGL。