繁体   English   中英

为什么我没有使用 GLFW 获得向前兼容的 OpenGL 上下文?

[英]Why am I not getting a forward compatible OpenGL context with GLFW?

据我所知,当我在 GLFW 上设置这些上下文约束时:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

我应该在正在运行的机器上获得最大可用的 OpenGL 上下文,前提是它高于 OpenGL 3.3。 但是,通过使用glGetString来获取 OpenGL 上下文版本,我发现情况并非如此。 每次我查询glGetString的上下文版本时,我只得到我用glfwWindowHint设置的主要和次要版本,上面没有。 请记住,我的 GPU 支持 OpenGL 4.5。

需要注意的另一件事是,当我没有设置任何约束时,实际上我得到了一个 OpenGL 4.5 上下文。

这是完整的源代码,它似乎复制了这个问题:

#define GLEW_STATIC

#include <iostream>

#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <glm\glm.hpp>

int main(int argc, char argv[])
{

    if (!glfwInit())
    {
        std::cerr  << "Failed to initialize GLFW 3.0.4" << std::endl;
        getchar();

        glfwTerminate();
        return -1;
    }

    std::cout << "Initialized GLFW 3.0.4" << std::endl;

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* m_window = glfwCreateWindow(640, 480, "Koala", NULL, NULL);

    if (!m_window)
    {
        std::cerr  << "Failed to create OpenGL 3.3+ context" << std::endl;
        getchar();
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(m_window);

    std::cout << "Created OpenGL 3.3+ context" << std::endl;

    glewExperimental = GL_TRUE;

    if (glewInit() != GLEW_OK)
    {
        std::cerr << "Failed to initialize GLEW 1.11.0" << std::endl;
        getchar();
        glfwTerminate();
        return -1;
    }

    std::cout << "Initialized GLEW 1.11.0" << std::endl;

    const GLubyte* renderer = glGetString(GL_RENDERER);
    const GLubyte* version = glGetString(GL_VERSION);

    std::cout << "GPU: " << renderer << std::endl;
    std::cout << "OpenGL Version: " << version << std::endl;

    while (!glfwWindowShouldClose(m_window))
    {
        glfwSwapBuffers(m_window);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;

}

我应该在运行的计算机上获得最大可用的OpenGL上下文,前提是它高于OpenGL 3.3。

那不是它的定义方式。 GLFW文档中

GLFW_CONTEXT_VERSION_MAJOR和GLFW_CONTEXT_VERSION_MINOR提示指定创建的上下文必须与之兼容的客户端API版本。

对于OpenGL,这些提示不是严格的约束,因为它们不必精确匹配,但是如果生成的OpenGL版本小于要求的提示,则glfwCreateWindow仍然会失败。

虽然无法向驱动程序询问支持的最高版本的上下文,但是当您向GLFW请求版本1.0的上下文时,大多数驱动程序都会提供此信息。

因此,“大多数驱动程序”会给您您所期望的,但这不能保证。

通常的用法是指定支持代码使用的所有功能的最低版本。 然后,您不必在乎是否获得该版本或更高版本。 但是您知道,如果不支持最低版本,则会失败。

如果要动态测试支持的版本,最好的选择是首先指定可以利用的最高版本,然后测试glfwCreateWindow()的返回值。 如果失败,请减少版本,直到失败,然后再次调用glfwCreateWindow() ,直到达到可以运行的最低版本。 然后,您可以跟踪成功的版本或glGetString(GL_VERSION)报告的版本,并使用它来确定运行时可以使用的功能。

您从 glGetString 收到的版本并不意味着该版本的功能受到限制。 根据我们的经验,我们收到了一个 3.3 上下文,它可以做任何来自该驱动程序的上下文可以做的所有事情(我的意思是 4.2+ 版本的功能)。 您只需要担心驱动程序所需的最低版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM