为什么glewInit()在调用glfwWindowHint()后导致GL_INVALID_ENUM

时间:2013-11-17 18:39:05

标签: opengl glew glfw

出于某种原因,当我调用glfwWindowHint()时:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

然后打电话给:

glewInit()

我最终得到一个glError:GL_INVALID_ENUM。当我遗漏所有glfwWindowHint()调用时,一切正常,并且没有设置glError。我是否错误地使用了这些库,或者这是glfw中的错误还是glew?

请注意,我使用的是glew-1.10.0和glfw-3.0.3

这是一个简单的程序来说明我看到的问题:

#include <iostream>

#include "GL/glew.h"
#include "GLFW/glfw3.h"

int main(char* argc, char* argv[])
{
    GLFWwindow* window;

    if (!glfwInit())
    {
        return -1;
    }

    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);

    window = glfwCreateWindow(800, 600, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);

    //glewExperimental = GL_TRUE; tried commenting this out but I still get the error
    if(glewInit() != GLEW_OK)
    {
        return -1;
    } 
    switch(glGetError())
    {
    case GL_INVALID_ENUM:
        std::cout << "why is this happening?";
    }
}

1 个答案:

答案 0 :(得分:4)

因为在核心配置文件上下文中,使用glGetString (...)查询扩展字符串无效。您必须使用glGetStringi (...)并逐个查询每个扩展程序。坦率地说,这是一个糟糕的设计,因为glGetStringi必须通过大多数平台上的扩展加载机制加载。这是鸡和鸡蛋的情况,核心配置文件中的正确行为肯定是在初始化之前使用glewExperimental = TRUE并忽略glewInit (...)之后的无效枚举错误。

我应该指出, 做错了。这是一个问题,如何在幕后实施GLEW,以及OpenGL ARB的一个有点可疑的决定。我会将GL_EXTENSIONS留给glGetString (...)进行查询,但定义了一些特殊字符串(例如“GL_CORE_PROFILE”)以在核心配置文件中返回。然后,每个人都以我的方式获胜。


顺便说一句,major.minor 3.3的glfwWindowHint不是导致此问题出现的问题。它实际上是你对GLFW_OPENGL_CORE_PROFILE的使用。核心配置文件仅对OpenGL 3.2+有效,因此该问题仅表现为major.minor≥3.2 核心的组合。