出于某种原因,当我调用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?";
}
}
答案 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 和 核心的组合。