我遇到这个问题已经有一段时间了,但出于我的爱,我无法找到解决方案。
我想渲染一个简单的三角形。但在编译程序时,我不断在 Visual Studio 中获得此输出。
注意>我不相信这不是链接问题而是其他问题。我已经检查了我的链接器无数次,一切都在那里!
链接:https://pastebin.com/xeTDd0Qu
主要内容
static const GLfloat g_vertex_buffer_data[] = {
100.0f, 100.0f, 0.0f,
150.0f, 100.0f, 0.0f,
100.0f, 150.0f, 0.0f,
};
GLFWwindow* window;
window = initWindow(640, 480, "Title");
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
while (!glfwWindowShouldClose(window)) {
glViewport(0, 0, 640, 480);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glFlush();
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
initWindow()
GLFWwindow* initWindow(int a_width, int a_height, const char* title) {
glewExperimental = GL_TRUE;
int err = glewInit();
if (!err) {
exit(-1);
}
if (!glfwInit()) {
printf("glfwInit() failed!");
return nullptr;
}
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
if (!window) {
glfwTerminate();
return nullptr;
}
return window;
}
谢谢!
编辑:我收到的异常消息: ConvexHullVisualiser.exe 中的 0x00000000 处抛出异常:0xC0000005:执行位置 0x00000000 时发生访问冲突。
最佳答案
您收到的错误告诉您您正在尝试执行一个指向 NULL 的函数指针。大多数 OpenGL 函数(在 Windows 上)都是函数指针,并在运行时加载。总的来说,这意味着您正在尝试执行尚未加载的 OpenGL 函数。
最有可能发生这种情况的原因是,只有存在有效的 OpenGL 上下文,GLEW 才能成功初始化。由于上下文是由 glfwCreateWindow
创建的,因此必须在此行之后调用 glewInit
。
您还缺少对 glfwMakeContextCurrent
的调用来绑定(bind) OpenGL 上下文
到事件线程。
if (!glfwInit()) {
printf("glfwInit() failed!");
return nullptr;
}
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
if (!window) {
glfwTerminate();
return nullptr;
}
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
int err = glewInit();
if (!err) {
exit(-1);
}
请注意,glewInit
不返回 int,而是返回 GLenum
。正确的错误检查应该看起来像这样:
GLenum err = glewInit();
if (GLEW_OK != err)
{
/* Problem: glewInit failed, something is seriously wrong. */
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
...
}
关于c++ - 使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54349863/