0

我读过在 OpenGL v3 中不推荐使用显示列表,尽管一些制造商会在可预见的未来支持它们。

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

4

2 回答 2

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;
            }
        }
    }
}
于 2015-02-21T18:09:44.683 回答
1

使用调用glGetStringGL_VERSION。如果版本等于或低于 2.1,则肯定支持显示列表。如果版本更高,则取决于您请求的是 OpenGL CORE 配置文件还是 OpenGL COMPATIBILITY配置文件。

为简化起见,如果您使用wglCreateContext(或其他平台上的等效项)创建上下文,则您正在创建一个兼容性配置文件。您还应该检查对GL_ARB_compatibility调用glGetString的支持GL_EXTENSIONS

于 2015-02-21T09:56:12.763 回答