我已经读过,在OpenGL v3中,显示列表已被弃用,但有些制造商会在可预见的未来支持它们。
是否有一个OpenGL get ...函数,它明确地告诉我在我正在询问的驱动程序中是否支持显示列表?
答案 0 :(得分:3)
如果您至少使用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;
}
}
}
}
答案 1 :(得分:1)
使用GL_VERSION
致电glGetString。如果版本等于或低于2.1,则肯定支持显示列表。如果版本较大,则取决于您是否请求了OpenGL CORE配置文件或OpenGL COMPATIBILITY配置文件。
为简化起见,如果您使用wglCreateContext(或在其他平台上等效)创建上下文,则表示您正在创建兼容性配置文件。您还应该检查GL_ARB_compatibility与GL_EXTENSIONS
调用glGetString的支持。