5

我确信一切都是正确链接的。我最初使用的是来自非官方 GLSDK 的 glload 和 glfw,但后来我决定取消 glload,这意味着我必须使用 glew 才能获得现代标头。

#include <GL/glew.h>
#include <GL/glfw.h>

根据说明,我在 glfw 之前包含了 glew 。

在运行期间,OpenGL 窗口打开

//(relevant code)
if(!glewInit()) {return -1; }
if(!glfwInit()) {return -1; }
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// also tried glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);

if(!glfwOpenWindow(1024, 768, 8, 8, 8, 8, 24, 8, GLFW_WINDOW)){
    glfwTerminate();
    return -1;
}

glfwSetWindowTitle("OpenGL 3.2");

//init method
glGenVertexArrays(1, &vao);  //<<  Access violation here.

有什么想法我的问题在这里吗?

我看过了。“使用带有 glew 的 VBO 的访问冲突”但这没有帮助。

4

3 回答 3

8

glewInit创建 OpenGL 上下文并绑定到当前线程之后调用,即glfwOpenWindow在您的情况之后。

于 2012-12-19T01:32:41.663 回答
3

有点晚了,但我想我还是会管的。

正如 datenwolf 所述,在您发布的相关代码中,glewInit()由于其定位,应该返回错误。

您可能遇到的其他潜在问题在GLEW部分 下的http://www.opengl.org/wiki/OpenGL_Loading_Library中进行了描述。

从上面复制粘贴:

GLEW 在核心上下文方面存在问题。它会调用glGetString(GL_EXTENSIONS)​,这会导致GL_INVALID_ENUM​ GL 3.2+ 核心上下文一glewInit()被调用。

GLEW 的解决方案(也由上述链接提供)是启用“实验”支持。前任:

glewExperimental = GL_TRUE;
GLenum err = glewInit();
if( err != GLEW_OK )
{
    printf("GlewInit error");
    exit(1);
}
于 2013-11-01T05:30:14.297 回答
2

也迟到了,但对于仍在寻找的人

glewExperimental = GL_TRUE;

在初始化上下文之前摆脱了访问冲突错误,而是使程序退出并出现 GL_INVALID_ENUM 错误。使用 GLFW,我不得不另外注释掉窗口提示:

//glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
//glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
//glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);

然后程序开始编译!

于 2015-10-05T00:57:15.700 回答