【问题标题】:JaxaFX Shader Issue on Ubuntu: Help translate errorUbuntu 上的 JaxaFX 着色器问题:帮助翻译错误
【发布时间】:2018-05-17 14:42:36
【问题描述】:

在 Java 中报告了一个我想解决的错误。我不确定是什么导致了错误,我想了解原因。

我正在使用 JavaFX、Java 8 和 Ubuntu 操作系统。我正在尝试在这里使用获取说明指南:https://developers.arcgis.com/java/latest/guide/display-a-scene.htm

很遗憾,我遇到了一个我无法理解的错误。

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException:Error code: 18
Error message: Internal error exception
Additional error message: star_draw,GL_VERTEX_SHADER:0:3(10): error: GLSL 1.50 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, 3.00 ES, 3.10 ES, and 3.20 ES

我如何才能了解此错误以及问题所在,以便开始对解决方案进行故障排除?

at com.esri.arcgisruntime.internal.mapping.view.RenderingContext.nativeDrawMap(Native Method)

这是我的 glxinfo:

mark@marks-computer:~$ glxinfo | grep version

server glx version string: 1.4
client glx version string: 1.4
GLX version: 1.4
    Max core profile version: 4.5
    Max compat profile version: 3.0
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 3.2
OpenGL core profile version string: 4.5 (Core Profile) Mesa 17.4.0-devel
OpenGL core profile shading language version string: 4.50
OpenGL version string: 3.0 Mesa 17.4.0-devel
OpenGL shading language version string: 1.30
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 17.4.0-devel
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20

最后一行似乎表明我应该没问题?

【问题讨论】:

  • 也许你应该按照错误说的做,并使用受支持的 GLSL 版本
  • 你安装的是什么版本的台面?
  • @JacobB。运行glxinfo时,好像我有3.20 ES
  • @sillyfly,好像是17.4.0-devel
  • 您可以访问着色器源吗?我在您的链接中没有看到任何内容,但着色器可能有一个 #version 150 指令,它会尝试使用 GLSL 1.5。

标签: java opengl javafx shader esri


【解决方案1】:

您的应用程序正在尝试编译 GLSL 1.50 着色器。 GLSL 1.50 版是在 OpenGL 3.2 中引入的,因此不能保证(并且通常不太可能)在 GL 3.2 以下版本的 OpenGL 上下文中尝试此操作。您收到的错误消息明确告诉您 GLSL 1.50 不可用。

由于您将 Linux 与来自 Mesa 3D project 的开源驱动程序一起使用,因此您无能为力。 Mesa 仅实现现代 OpenGL 的 核心配置文件,而不是兼容性配置文件。对于遗留应用程序,mesa 还支持高达 GL 3.0 (GLSL 1.30) 的遗留上下文。从输出中可以清楚地看出,您的应用程序确实使用了旧版上下文。

请注意,OpenGL 规范明确声明兼容性配置文件支持是可选。根据规范,您的应用程序只是尝试在遗留上下文中使用 GL 3.2+ 功能,只是损坏了。这仅适用于公开可选兼容性配置文件的驱动程序。唯一真正的解决方案是修复 JavaFX 以使用核心配置文件上下文(这需要摆脱他们正在使用的所有已弃用的 GL 功能 - 而这些东西现在已经被弃用了十年!),或者将自身限制为 GL 2.1 并保留旧版上下文(在带有 mesa 的 linux 上,3.0 也可以工作,但 mac 上的 OSX 在旧版模式下最多可以执行 2.1)。

可能可以通过将环境变量 MESA_GLSL_VERSION_OVERRIDE=150 设置为在您的 3.0 上下文中伪造对 GLSL 1.50 的支持来解决您的问题,但这只是一个糟糕的 hack,可能会引入各种自己的问题...

【讨论】:

  • 我已将赏金授予此答案,因为它是最全面的答案,并且赏金即将到期。不幸的是,似乎答案是“无能为力”。我能想到的唯一其他选择是尝试强制我的 Optimus 笔记本电脑使用 GeForce 驱动程序而不是英特尔?如果可能的话,有什么想法吗?此外,是硬件还是驱动程序决定了 OpenGL 的最高版本?
  • 好吧,正如 mesa 所展示的那样,您的硬件能够支持 GL 4.5(可能有一些功能 mesa 可能必须模拟才能达到该级别,特别是旧英特尔 GPU 上的 64 位浮点支持),所以原则上,可以为它编写一个 GL 4.5 兼容驱动程序。台面开发人员刚刚决定不花这么多精力来支持过时的功能。另一方面,nvidia 专有驱动程序支持兼容性配置文件,如果您让 optimus 或 PRIME 工作,您实际上应该能够使用 nvidia 卡运行它。
【解决方案2】:

这是 Ubuntu 14.04 的一个已知问题。我添加了几种方法来尝试:

您的 glxinfo 中的行似乎可以解决所有问题:

OpenGL 着色语言版本字符串:1.30

您的 OpenGL 驱动程序仅支持 GLSL 版本 1.30

  • 尝试在着色器代码中添加 #version 330(或任何其他版本)。
  • 或尝试强制 MESA_GLSL_VERSION_OVERRIDE=1.50
  • --use-gl=egl 可以作为临时解决方案。

尝试所有方法,如果没有一个成功,尝试联系开发人员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多