我读过在 OpenGL v3 中不推荐使用显示列表,尽管一些制造商会在可预见的未来支持它们。
是否有一个 OpenGL get... 函数明确告诉我我正在询问的驱动程序是否支持显示列表?
我读过在 OpenGL v3 中不推荐使用显示列表,尽管一些制造商会在可预见的未来支持它们。
是否有一个 OpenGL get... 函数明确告诉我我正在询问的驱动程序是否支持显示列表?
如果您至少使用 OpenGL 3.0,则可以使用glGetIntegerv()
. 如果您处理更旧的版本,则必须先检查glGetString(GL_VERSION)
。如果低于 3.0,你就完成了(支持显示列表)。否则,请继续进行以下检查。
在 3.0 及更高版本中,您还可以通过以下方式获取当前版本:
GLint majVers = 0, minVers = 0;
glGetIntegerv(GL_MAJOR_VERSION, &majVers);
glGetIntegerv(GL_MINOR_VERSION, &minVers);
虽然核心配置文件仅在 3.2 中引入,但显示列表已在 3.0 中标记为已弃用。当时引入了“向前兼容”标志。所以理论上,你可以有一个不支持显示列表的 3.0 实现。然后,从 3.2 开始,任何使用核心配置文件的东西显然都没有显示列表。
这是未经测试的,但我相信测试它的正确逻辑如下所示:
bool hasDisplayLists = true;
if (strcmp(glGetString(GL_VERSION), "3") > 0) {
// Check for forward-compatible flag in 3.0 and higher.
GLint ctxFlags = 0;
glGetIntegerv(GL_CONTEXT_FLAGS, &ctxFlags);
if (ctxFlags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) {
hasDisplayLists = false;
} else {
GLint majVers = 0, minVers = 0;
glGetIntegerv(GL_MAJOR_VERSION, &majVers);
glGetIntegerv(GL_MINOR_VERSION, &minVers);
// Check for core profile in 3.2 and higher.
if (majVers > 3 || minVers >= 2) {
GLint profMask = 0;
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, profMask);
if (profMask & GL_CONTEXT_CORE_PROFILE_BIT) {
hasDisplayLists = false;
}
}
}
}
使用调用glGetStringGL_VERSION
。如果版本等于或低于 2.1,则肯定支持显示列表。如果版本更高,则取决于您请求的是 OpenGL CORE 配置文件还是 OpenGL COMPATIBILITY配置文件。
为简化起见,如果您使用wglCreateContext(或其他平台上的等效项)创建上下文,则您正在创建一个兼容性配置文件。您还应该检查对GL_ARB_compatibility调用glGetString的支持GL_EXTENSIONS
。