当前位置: 首页 > 知识库问答 >
问题:

为什么我没有得到一个与GLFW向前兼容的OpenGL上下文?

佟阳云
2023-03-14

据我所知,当我在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上下文,前提是它高于OpenGL3.3。但是,通过使用GlgetString获取OpenGL上下文版本,我发现情况并非如此。每次我查询glgetstring上下文版本时,我只得到用glfwwindowhint设置的主要版本和次要版本,上面没有任何内容。请记住,我的GPU支持OpenGL4.5。

另一件需要注意的事情是,当我没有设置任何约束时,我实际上得到了一个OpenGL4.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;

}

共有1个答案

陈知
2023-03-14

我应该在运行的机器上获得最大可用的OpenGL上下文,前提是它高于OpenGL3.3。

它不是这样定义的。来自GLFW文档:

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

对于OpenGL,这些提示不是硬约束,因为它们不必完全匹配,但是如果生成的OpenGL版本小于请求的版本,glfwCreateWindow仍然会失败。

虽然没有办法向驱动程序请求支持的最高版本的上下文,但当您向GLFW请求1.0版本的上下文时,大多数驱动程序都提供了这一点。

所以“大多数司机”会给你你所期望的,但这并不保证。

如果要动态测试支持哪个版本,最好的方法可能是首先指定可以利用的最高版本,然后测试glfwcreatewindow()的返回值。如果失败,只要失败,就降低版本,并再次调用glfwcreatewindow(),直到达到可以运行的最低版本。然后,您可以跟踪哪个版本成功了,或者glgetstring(GL_VERSION)报告的版本,并在运行时使用它来决定可以使用哪些特性。

 类似资料:
  • 我将我的最低API版本设置为8,但当我使用API 14中添加的函数时,android SDK无法警告我。为什么呢?

  • 问题内容: 我知道静态方法在类级别。因此,我知道我不需要创建实例来调用静态方法。但我也知道我可以将静态方法(如LIKE)称为实例方法。这是我感到困惑的地方,因为我期望从null对象调用静态方法(就像在调用实例方法中一样)。我真的很感谢一些解释,为什么我错了一个期望。 这是示例代码: 问题答案: 通过实例调用静态方法不需要实例存在。只要编译器能够确定变量的类型,它就可以在评估表达式并丢弃结果后静态进

  • 我第一次制作Spring靴。我使用的是Spring启动版本2.3.4。我也使用后格雷SQL。我想创建两个表:玩家和团队。球队应该有一个球员名单。 所以我创建了下面两个实体类: 和 您可能已经知道,Spring boot会自动创建表格。团队表没有球员列的问题。 这里怎么了?也许我不需要看到球队表中的球员栏?(这对我来说很奇怪……)有没有更好的方法来定义值列表或数组? 此外,我想了解:是否定义了玩家团

  • 我一直试图编写一些opengl代码,在任何地方都可以使用,但又不太限制自己。 我想在只支持opengles2的设备上使用opengles2,在支持opengl核心的设备上使用opengles2。 另外,我希望能够在运行时选择使用哪一个(当然,如果可用的话)。 我知道GLEW,但不幸的是,大多数linux distros发布的GLEW版本仍然不兼容GLES2(debian,我在看你)。它只是分割断层

  • 我目前正在考虑处理OpenGL上下文重新创建。 我使用GLFW库创建OpenGL上下文,GL3W用于扩展加载器。 我的问题很简单:在重建上下文时,我是否应该考虑再次调用gl3wInit()?

  • 问题内容: 我正在编写一个简单的项目,一个使用Swing编写的业务应用程序,它使用Hibernate作为后端。我来自Spring,这为我提供了使用hibernate和事务的简便方法。无论如何,我设法让Hibernate工作。昨天,在编写一些代码从数据库中删除bean的同时,我得到了以下信息: 删除代码很简单: 我的是: 其他详细信息:仅在关闭应用程序时,我才会在代码中关闭hibernate会话。这