【问题标题】:Is there a way to check if a platform supports an OpenGL function?有没有办法检查平台是否支持 OpenGL 功能?
【发布时间】:2021-12-31 21:00:30
【问题描述】:

我想使用glTexStorageXX() 加载一些纹理,但如果该功能不适用于平台,也可以退回到glTexImageXX()

有没有办法检查这些功能在平台上是否可用?如果使用 OpenGL 3.3,我认为 glew.h 可能会尝试将 GL_ARB_texture_storage 扩展加载到同一个函数指针中,但我不确定如何检查它是否成功。是检查函数指针那么简单,还是更复杂?

(另外,我猜测glew.h 的工作方式可能是错误的,它可能不使用函数指针,这可能不是我可以进行的运行时检查?如果是这样,我会。 ..需要为不同版本的OpenGL编译可执行文件?)

if (glTexStorage2D) {
    // ... calls that assume all glTexStorageXX also exist, 
    // ... either as core functions or as ARB extensions
} else {
    // ... calls that fallback to glTexImage2D() and such.
}

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    您需要检查是否支持 OpenGL 扩展。 GL 实现支持的扩展数量可以用glGetIntegerv(GL_NUM_EXTENSIONS, ...) 调用。 扩展名可以通过glGetStringi(GL_EXTENSIONS, ...)查询。

    将扩展读入std::set

    #include <set>
    #include <string>
    
    GLint no_of_extensions = 0;
    glGetIntegerv(GL_NUM_EXTENSIONS, &no_of_extensions);
    
    std::set<std::string> ogl_extensions;
    for (int i = 0; i < no_of_extensions; ++i)
        ogl_extensions.insert((const char*)glGetStringi(GL_EXTENSIONS, i));
    

    检查是否支持扩展:

    bool texture_storage = 
        ogl_extensions.find("GL_ARB_texture_storage") != ogl_extensions.end();
    

    glTexStorage2D 自 OpenGL 4.2 版起就在核心中。因此,如果您至少创建了 OpenGL 4.2 上下文,则无需查找扩展。
    支持扩展时,将支持扩展规范中指定的所有特性和功能。 (见GL_ARB_texture_storage


    GLEW 使这更容易一些,因为它为每个扩展提供了一个布尔状态。
    (见GLEW - Checking for Extensions)例如:

    if (GLEW_ARB_texture_storage)
    {
        // [...]
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2023-03-07
      • 2021-01-21
      相关资源
      最近更新 更多