使用 GLEW 和 GLFW 时出现访问冲突。

5

我确信一切都链接正确。起初我使用的是非官方GLSDK中的glload和glfw,但后来我决定放弃glload,这意味着我必须使用glew才能访问现代头文件。

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

根据指示,我已将glew包含在glfw之前。

运行时,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访问冲突”,但是没有帮助。

3个回答

8

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


谢谢,我按照你说的移动了它。if(!glewInit()) {return -1; }是不正确的,因为它不是一个布尔值,我需要检查它返回的值。 - Andrew

3
有点晚了,但我还是想参与一下。
如datenwolf所提到的,在您发布的相关代码中,glewInit()应该由于其位置而返回错误。
您可能遇到的另一个潜在问题在http://www.opengl.org/wiki/OpenGL_Loading_LibraryGLEW部分中有描述。
从上面复制粘贴:
GLEW在核心环境中存在问题。它调用glGetString(GL_EXTENSIONS)​,这会导致GL 3.2+核心上下文中的GL_INVALID_ENUM​在调用glewInit()​时立即出现。
GLEW的解决方案(也由上面的链接提供)是启用“实验性”支持。例如:
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if( err != GLEW_OK )
{
    printf("GlewInit error");
    exit(1);
}

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

程序然后开始编译!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接