jogamp 2.3.2 OpenGL版本映射错误 bug 解决

平时遇到很多技术问题基本都能在 google 和 stackoverflow 上找到答案,这次遇到的这个问题很奇葩,解决方法也很神奇,略记一下。

背景

最近在用 Java3d 的库在树木重建实验,实验室的 Ubuntu 机器用得习惯了,就在 Ubuntu 上做日常开发。开发用的 IDE 是 IntelliJ IDEA, 使用 Java3d 依赖这几个包:

j3dcore.jar
j3dutils.jar
gluegen-rt.jar
gluegen-rt-natives-平台-架构.jar
jogl-all.jar
jogl-all-natives-平台-架构.jar

昨天(2018-04-15)晚上想在 Ubuntu 上编译为知笔记Qt版的客户端,就用 apt 安装了 libgl-dev, 之后Java3d就起不来了,运行后就会抛出如下异常:

com.jogamp.opengl.GLException: J3D-Renderer-1: createImpl ARB n/a but required, profile > GL2 requested (OpenGL >= 3.1). Requested: GLProfile[GL3bc/GL3bc.sw], current: 3.0 (Compat profile, compat[ES2], FBO, software) - 3.0 Mesa 17.2.8
    at jogamp.opengl.x11.glx.X11GLXContext.createImpl(X11GLXContext.java:440)
    at jogamp.opengl.GLContextImpl.makeCurrentWithinLock(GLContextImpl.java:765)
    at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:648)
    at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:586)
    at javax.media.j3d.JoglPipeline.createNewContext(JoglPipeline.java:6411)
    at javax.media.j3d.Canvas3D.createNewContext(Canvas3D.java:4602)
    at javax.media.j3d.Canvas3D.createNewContext(Canvas3D.java:2376)
    at javax.media.j3d.Renderer.doWork(Renderer.java:881)
    at javax.media.j3d.J3dThread.run(J3dThread.java:271)

DefaultRenderingErrorListener.errorOccurred:
CONTEXT_CREATION_ERROR: Renderer: Error creating Canvas3D graphics context
graphicsDevice = X11GraphicsDevice[screen=0]
canvas = javax.media.j3d.Canvas3D[canvas0,0,0,1000x931]
X11Util.Display: Shutdown (JVM shutdown: true, open (no close attempt): 2/2, reusable (open, marked uncloseable): 0, pending (open in creation order): 2)
X11Util: Open X11 Display Connections: 2
X11Util: Open[0]: NamedX11Display[:0, 0x7fd520005760, refCount 1, unCloseable false]
X11Util: Open[1]: NamedX11Display[:0, 0x7fd520087b00, refCount 1, unCloseable false]

核心就是这句话:

createImpl ARB n/a but required, profile > GL2 requested (OpenGL >= 3.1). Requested: GLProfile[GL3bc/GL3bc.sw], current: 3.0 (Compat profile, compat[ES2], FBO, software) - 3.0 Mesa 17.2.8

分析

第一眼看到这个异常我是懵逼的,当看到 OpenGL 后我意识到是我乱升级一些包导致的,赶紧又跑一遍 sudo apt purge libgl-dev,(实际上最后 remove 了一个似乎叫 libgl1-mesa-dev 的包)。但是 Java3d 的程序还是跑不起来!这下我就郁闷了,看文字意思是说我的 OpenGL 版本过低只有 3.0,实际需要 3.1,我就查看了一下OpenGL版本:


jogamp 2.3.2 OpenGL版本映射错误 bug 解决_第1张图片

版本似乎没有问题,难道我该升级 Java3d?去 Java3d 官网看了一下,是最新版本的库,又去 jogamp 官网看了一下,也是最新版本库。最后搜了半天,总算找到一个哥们遇到类似的问题:
http://forum.jogamp.org/problem-using-jogl-2-3-2-on-linux-td4038557.html

实际上这应该算 jogamp 的一个 bug,社区已经有人给了 Patch:
https://jogamp.org/bugzilla/show_bug.cgi?id=1357

但是最新的 Release 仍然是 2.3.2 的版本,也就是说我得手动把这个 Patch 搞到 jar 包里面。Patch 提供了一个 class 字节码文件(GLContextImpl.class),我找了一下,这是 jogl-all.jar 下面的一个文件(包路径:jogamp.opengl),我就直接用 Ubuntu 的图形化界面打开了那个 jar 包,把 GLContextImpl.class 给拖进去了。但是这样验证 jar 的签名就会失败,我又把 jar 下面的 META-INF/MANIFEST.MF 文件给重命名成另外一个文件,再重新 build & run Java3d程序,就可以正常地跑起来了!

2018.7 后记

没想到会有人遇到一样的问题然后找到这篇文章,刚才看了一下我给出的页面加载不出来了。这是个麻烦事,所以我把Patch的 class 字节码放百度网盘了,需要者自取。提取密码:ajqe

你可能感兴趣的:(jogamp 2.3.2 OpenGL版本映射错误 bug 解决)