【问题标题】:How to test if OpenGL application works against some particular OpenGL version?如何测试 OpenGL 应用程序是否适用于某些特定的 OpenGL 版本?
【发布时间】:2021-12-01 08:44:39
【问题描述】:

最近我意识到我的应用程序正在使用仅在 OpenGL 4.5 - glCreateTextures 上可用的 OpenGL 调用,而我意识到这一点只是因为我试图在仅支持 OpenGL 4.1 的 MacOS 计算机上运行该应用程序并且它在那里崩溃了.

应用程序请求 OpenGL 4.0 核心配置文件、3.2 核心配置文件和 3.2 前向兼容核心配置文件(按此顺序),但尽管获得了 4.0 配置文件,但对 glCreateTextures 的调用仍会成功,没有任何警告。

我希望我的应用程序可以在任何支持 3.2 的设备上运行,但我无法定期访问实际上不支持 4.5 的硬件。在 API 和着色器使用中可能存在其他类似的问题,这些问题会妨碍与较低 OpenGL 版本的兼容性,我想了解它们。

我如何测试我的应用程序以确保它可以与某些特定版本的 OpenGL(3.2、4.0)一起工作,而无需在支持较新版本的硬件上实际运行它?

在我的情况下,应用程序在 JVM 上运行(用 Scala 或 Java 编写)并使用 LWJGL + GLFW 绑定,但即使知道如何对原生 C/C++ 应用程序执行此操作也会有所帮助,如果有办法,它应该有可能将其转换为 JVM 世界。

【问题讨论】:

    标签: opengl lwjgl backwards-compatibility


    【解决方案1】:

    这是 OpenGL 的一个普遍问题,加载核心函数和同名扩展函数之间没有区别。

    glCreateTextures 的情况下,此 OpenGL 函数既来自 ARB_direct_state_access 扩展,也来自具有相同名称的 OpenGL 4.5(该函数成为核心)。

    在 LWJGL 的具体上下文中实际发生的是,它将在运行时检查上下文是否支持 OpenGL 4.5(自 OpenGL 3.0 以来有一个明确的函数允许检查 OpenGL 上下文是否支持特定的核心版本) .当您请求核心配置文件时,LWJGL 会发现此检查返回 false。 3.3 核心。

    然而,LWJGL 检查每个广告 OpenGL 扩展的存在,并从这些扩展加载所有公开函数的函数指针。 在您的情况下,当您请求时,例如3.3 核心上下文,但您的驱动程序 仍然 暴露 ARB_direct_state_access(这很好)然后 LWJGL 加载 glCreateTextures 的函数指针就好了。 并且由于在LWJGL中通过核心GL类或通过扩展类调用GL函数调用的路由没有区别(毕竟还是同一个底层GL函数),所以调用会成功。

    现在为了解决这个问题,有一个 GitHub 问题允许 LWJGL 客户端排除某些扩展被加载:https://github.com/LWJGL/lwjgl3/issues/683

    一旦这在 LWJGL 3 版本中登陆,当您排除扩展时,在您请求的 GL 核心版本中不是核心的功能将不可见/不可用。

    另一种至少降低使用来自比您的应用所针对的更高版本 GL 版本的 GL 函数的风险的方法是,根本不使用 org.lwjgl.opengl.GLxyC 类中的任何方法,其中 x.y 更高比您的应用所针对的 GL 版本。

    实际上,当你说:

    最近我意识到我的应用程序正在使用仅在 OpenGL 4.5 - glCreateTextures 上可用的 OpenGL 调用,而我意识到这一点只是因为我试图在仅支持 OpenGL 4.1 的 MacOS 计算机上运行该应用程序并且它在那里崩溃了。

    那么有人可以说这是你的事。因为这意味着您故意使用 GL45 类中的 OpenGL 函数,所以您想要以 OpenGL 4.5 为目标。

    【讨论】:

    • 我故意使用一些 4.5 功能,但是可选(当我检测到 OpenGL 处于相应版本时)。尽管如此,这意味着我已经将它们导入,并且很容易在其他地方意外使用它们(或其他一些 4.5 功能)。
    • 为了验证我是否正确理解了你写的关于扩展的内容——这是否意味着这个问题在原生世界中不存在,并且使用具有 4.0 核心配置文件的 C 源代码中的 glCreateTextures 实际上会失败?
    • 当您加载glCreateTextures 的函数指针时,它也会在原生世界中成功,无论您是否认为 OpenGL 4.5 内核可用,或者您想通过 ARB 扩展来实现。
    • @Suma 所以这一切都归结为:你需要警惕你正在使用的 GL 函数。 LWJGL 3 可以通过 org.lwjgl.opengl.GLxyC 类在一定程度上帮助您做到这一点,这些类仅将 OpenGL 函数公开到 GL 版本 x.y。您的任务是确定您通过哪些类调用哪些函数。
    • 我知道这是我的任务,但如果有一些工具、技术或任何东西可以帮助我,那就太好了。独自一人战斗,感觉很孤独。一个人想知道:真的必须这样吗? GLSL 的情况如何:当我在着色器中请求 #version 330 时,如果我使用某些 4.x 功能,我能否确定编译会失败?
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多