代码之家  ›  专栏  ›  技术社区  ›  Anne Quinn

有没有办法检查平台是否支持OpenGL功能?

  •  1
  • Anne Quinn  · 技术社区  · 4 年前

    glTexStorageXX() ,但也要回到 glTexImageXX()

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

    (同时,我也在猜测 这可能是错误的,它可能不使用函数指针,这可能不是我可以进行的运行时检查?如果是的话,我会不会。。。需要为不同版本的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.
    }
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   Rabbid76    4 年前

    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
    支持扩展时,支持扩展规范中指定的所有特性和功能。(见 GL_ARB_texture_storage )


    GLEW 由于它为每个扩展提供了一个布尔状态,这使得这一点变得更容易。
    GLEW - Checking for Extensions )例如:

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