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

Is there a way to check if a platform supports an OpenGL function?

我想使用 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.
}

您需要检查是否支持 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)
{
    // [...]
}