每当我在windows上调用glGenBuffers时,我都会遇到问题。每当我调用glGenBuffers或任何3.2或更高的函数时,OpenGL都会返回一个INVALID_OPERATION错误。在浏览完web之后,这可能是由于windows上没有更新3.2的函数指针所致。从我所读到的所有内容中,您必须在运行时通过要求windows wglGetProcAddress返回函数指针以在您的程序和当前驱动程序中使用来获取函数指针。这本身并不难,但为什么要重新发明轮子呢?相反,我选择包含GLEW来为我处理函数指针。
这里有一个小程序来演示我的问题。
#define GLEW_STATIC
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <iostream>
void PrintError(void)
{
// Print glGetError()
}
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr);
glfwMakeContextCurrent(window);
PrintError();
// Initalize GLEW
glewExperimental = GL_TRUE;
GLenum error = glewInit();
if(error!= GLEW_OK)
std::cerr << glewGetErrorString(error) << std::endl;
// Glew information
if(GLEW_VERSION_3_2)
std::cout << "Supports 3.2.." << std::endl;
// Try buffer
GLuint buffer;
glGenBuffers(1,&buffer); // INVALID_OPERATION
PrintError(); // Error shows up
// This is our main loop
while(!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}当我运行下面的代码时,我会得到一个OpenGL窗口。但是,在我的控制台中,我看到对PrintError的第一个调用返回了NO_ERROR,而第二个调用返回了INVALID_OPERATION。我有一种感觉,我忽略了一些小的事实,但我只是无法找到它在glfw或glfw的网页上。
我目前正在运行: glfw-3.0.4 (32位) glew-1.10.0 (32位)
*更新*
作为对魅力帖子的回应,我在glewInit()方法之后添加了以下代码。
GLenum loop_error = glGetError();
while (loop_error != GL_NO_ERROR)
{
switch (loop_error)
{
case GL_NO_ERROR: std::cout << "GL_NO_ERROR" << std::endl; break;
case GL_INVALID_ENUM: std::cout << "GL_INVALID_ENUM" << std::endl; break;
case GL_INVALID_VALUE: std::cout << "GL_INVALID_VALUE" << std::endl; break;
case GL_INVALID_OPERATION: std::cout << "GL_INVALID_OPERATION" << std::endl; break;
case GL_INVALID_FRAMEBUFFER_OPERATION: std::cout << "GL_INVALID_FRAMEBUFFER_OPERATION" << std::endl; break;
case GL_OUT_OF_MEMORY: std::cout << "GL_OUT_OF_MEMORY" << std::endl; break;
}
loop_error = glGetError();
}这证实了他的假设,即无效的操作是由glewinit代码引起的。
*更新*
看起来这是GLEW & 3.2上下文中的一个已知问题。图书馆
在找到GLEW作为麻烦制造者之后,我找到了以下两个职位。OpenGL: glGetError()在调用glewInit()后返回无效枚举
似乎建议的解决方案是设置实验标志,我已经在做了。然而,该网站提到,即使这样做了,他们仍然有可能导致无效的操作,并未能抓取函数指针。
在这一点上,我认为我最好的解决方案就是获取我自己的函数指针。
发布于 2014-06-29 06:25:15
很可能你得到的错误是来自GLFW或GLEW的残余错误。
尝试在库init代码之后添加以下内容:
GLenum error;
while ((error = glGetError()) != GL_NO_ERROR)
{
// print(error), etc...
}在尝试调用任何OpenGL函数之前,清除错误缓存。
如果错误确实是由GLEW引起的,那么它不一定是阻止库工作的危险错误。所以我不会因为这个问题而放弃这个库,这个问题最终会被解决。但是,如果您确实决定自己获取函数指针,GLFW将提供glfwGetProcAddress函数,这将允许您以可移植的方式这样做。
https://stackoverflow.com/questions/24472405
复制相似问题