首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glGenBuffers - GL_INVALID_OPERATION

glGenBuffers - GL_INVALID_OPERATION
EN

Stack Overflow用户
提问于 2014-06-29 01:26:17
回答 1查看 2.9K关注 0票数 1

每当我在windows上调用glGenBuffers时,我都会遇到问题。每当我调用glGenBuffers或任何3.2或更高的函数时,OpenGL都会返回一个INVALID_OPERATION错误。在浏览完web之后,这可能是由于windows上没有更新3.2的函数指针所致。从我所读到的所有内容中,您必须在运行时通过要求windows wglGetProcAddress返回函数指针以在您的程序和当前驱动程序中使用来获取函数指针。这本身并不难,但为什么要重新发明轮子呢?相反,我选择包含GLEW来为我处理函数指针。

这里有一个小程序来演示我的问题。

代码语言:javascript
复制
#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()方法之后添加了以下代码。

代码语言:javascript
复制
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()后返回无效枚举

似乎建议的解决方案是设置实验标志,我已经在做了。然而,该网站提到,即使这样做了,他们仍然有可能导致无效的操作,并未能抓取函数指针。

在这一点上,我认为我最好的解决方案就是获取我自己的函数指针。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-29 06:25:15

很可能你得到的错误是来自GLFW或GLEW的残余错误。

尝试在库init代码之后添加以下内容:

代码语言:javascript
复制
GLenum error;
while ((error = glGetError()) != GL_NO_ERROR) 
{
    // print(error), etc...
}

在尝试调用任何OpenGL函数之前,清除错误缓存。

如果错误确实是由GLEW引起的,那么它不一定是阻止库工作的危险错误。所以我不会因为这个问题而放弃这个库,这个问题最终会被解决。但是,如果您确实决定自己获取函数指针,GLFW将提供glfwGetProcAddress函数,这将允许您以可移植的方式这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24472405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档