使用JOGL和Android OpenGL编写可移植的Java应用程序

10

我计划编写一个Java 3D游戏,可以在PC和Android上运行。不幸的是,貌似没有适用于这两个平台的通用OpenGL API。

这些API是否存在显著差异?我能否在两个版本中使用相同的3D代码?这是一个好主意吗?


不错的问题 - 移动平台上的可移植性仍然不是现实。 - whatnick
尝试使用Qt。它是跨平台的,并在Windows,Mac OSX,Linux,iOS,Android,BlackBerry,Windows RT和(即将推出的)Windows Phone中运行。它提供了可在所有平台上兼容的最小OpenGL函数集,但您也可以使用每个平台特定的OpenGL函数(例如,在桌面上使用完整的OpenGL函数)。 - trusktr
4个回答

11

Android支持OpenGL ES 1.0,它与OpenGL 1.3重叠,因此这应该是可行的,但并不像仅仅在运行时替换jar文件那么简单。

尽可能地重用应用程序在两个平台上的代码是一个好主意。总之,最好的做法是将代码与外部依赖项(如OpenGL)隔离开来,即使您没有特别需要OpenGL ES支持。您永远不知道未来您可能要将应用程序移植到哪个API/平台上。

有两个可用的选项。

第一种方法是将OpenGL实现隐藏在应用程序其余部分使用的接口后面,然后提供单独的Jogl和Android实现。根据您运行的平台,您可以使用工厂模式在运行时选择正确的实现。

由于OpenGL ES和OpenGL非常相似,只要您坚持使用公共函数,就不需要太高的维护工作量。

另一种选择是尝试使用具有配置文件支持的Jogl2。它们似乎正好提供了您需要的功能,但Jogl2仍处于测试版。

本页底部讨论了一下配置文件: http://kenai.com/projects/jogl/pages/FAQ

配置文件允许Java应用程序以一种允许与多个OpenGL版本同时兼容的方式编写。由于OpenGL ES(用于嵌入式系统的GL)具有与OpenGL本身重叠的功能,因此它开放了向桌面和嵌入式实现添加甚至桥接配置文件的机会。

您可能需要阅读此http://michael-bien.com/mbien/entry/jogl_2_opengl_profiles_explained了解有关配置文件的详细信息。


非常好的研究答案。有一个很棒的操作系统 JOGL 应用程序叫做 worldwind,我正在开发它,我愿意为了在 Android 上运行它而付费。 - whatnick

4

这个项目已经完成。虽然API有所不同,但功能上有共同的部分。我们最终编写了一个简单的预处理器,将JOGL代码转换为ES版本,并使用Eclipse自动化转换。


2
你能分享一下预处理器吗? - Rom1
请分享预处理器。我遇到了同样的问题。 - jmishra
2
不确定是否有帮助,您可能可以使用GCC的cpp。无论如何,这是我们的项目(Netacka 3D):http://students.mimuw.edu.pl/~pm262952/netacka/ 这是预处理器(用Python编写):http://pastebin.com/iPjDHiTR 还有一个示例源文件:http://pastebin.com/vwHGcyC0 - hmp

2

几年前,JOGL-ES已经合并到了JOGL 2.x中,现在您可以在桌面和移动环境(Android)中使用JOGL。


1

Java3D和Android OpenGL API之间实际上有相当大的区别。首先,Java3D是对3D的更高级抽象。即使您使用类似JOGL的东西,API也会有一些差异。您最好将代码库中的实际3D绘图实现抽象出来,可以共享其余逻辑,但然后具有处理OpenGL / 3D绘图的平台特定代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接