OpenGL显示列表(已弃用但受支持)如何判断是否支持?

时间:2015-02-21 08:59:38

标签: opengl properties deprecated displaylist

我已经读过,在OpenGL v3中,显示列表已被弃用,但有些制造商会在可预见的未来支持它们。

是否有一个OpenGL get ...函数,它明确地告诉我在我正在询问的驱动程序中是否支持显示列表?

2 个答案:

答案 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_compatibilityGL_EXTENSIONS调用glGetString的支持。