有没有办法检查平台是否支持 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)
{
// [...]
}
我想使用 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)
{
// [...]
}