GLFW3 和 GLEW32:0xC0000005:访问冲突执行位置
GLFW3 and GLEW32: 0xC0000005: Access violation executing location
当我 运行 以下代码时,我从行 glGenVertexArrays(1, &VertexArrayID);
中得到一个错误,抱怨 Access violation
。我知道这个错误是由 NULL
指针引起的,但我的 GLuint
不应该。
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <gl/GL.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
static const GLfloat g_vertex_buffer_data[] = {
-1.0f,-1.0f,-1.0f, // triangle 1 : begin
-1.0f,-1.0f, 1.0f,
-1.0f, 1.0f, 1.0f, // triangle 1 : end
1.0f, 1.0f,-1.0f, // triangle 2 : begin
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f, // triangle 2 : end
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f
};
static const GLfloat g_color_buffer_data[] = {
0.583f, 0.771f, 0.014f,
0.609f, 0.115f, 0.436f,
0.327f, 0.483f, 0.844f,
0.822f, 0.569f, 0.201f,
0.435f, 0.602f, 0.223f,
0.310f, 0.747f, 0.185f,
0.597f, 0.770f, 0.761f,
0.559f, 0.436f, 0.730f,
0.359f, 0.583f, 0.152f,
0.483f, 0.596f, 0.789f,
0.559f, 0.861f, 0.639f,
0.195f, 0.548f, 0.859f,
0.014f, 0.184f, 0.576f,
0.771f, 0.328f, 0.970f,
0.406f, 0.615f, 0.116f,
0.676f, 0.977f, 0.133f,
0.971f, 0.572f, 0.833f,
0.140f, 0.616f, 0.489f,
0.997f, 0.513f, 0.064f,
0.945f, 0.719f, 0.592f,
0.543f, 0.021f, 0.978f,
0.279f, 0.317f, 0.505f,
0.167f, 0.620f, 0.077f,
0.347f, 0.857f, 0.137f,
0.055f, 0.953f, 0.042f,
0.714f, 0.505f, 0.345f,
0.783f, 0.290f, 0.734f,
0.722f, 0.645f, 0.174f,
0.302f, 0.455f, 0.848f,
0.225f, 0.587f, 0.040f,
0.517f, 0.713f, 0.338f,
0.053f, 0.959f, 0.120f,
0.393f, 0.621f, 0.362f,
0.673f, 0.211f, 0.457f,
0.820f, 0.883f, 0.371f,
0.982f, 0.099f, 0.879f
};
GLFWwindow* GLFWInit()
{
if (!glfwInit())
{
fprintf(stderr, "Failed to initialize GLFW\n");
}
glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want OpenGL 3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // We don't want the old OpenGL
GLFWwindow* window; // (In the accompanying source code, this variable is global for simplicity)
window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
glewExperimental = GL_TRUE;
// Initialize GLEW to setup the OpenGL Function pointers
glewInit();
if (window == NULL) {
printf("Failed to create window context.\n");
}
glfwMakeContextCurrent(window); // Initialize GLEW
return window;
}
int main()
{
GLFWwindow* window = GLFWInit();
//vertex shader ID array setup:
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
// some other code
while (!glfwWindowShouldClose(window)) {
// wipe the drawing surface clear
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// update other events like input handling
glDrawArrays(GL_TRIANGLES, 0, 12 * 3); // 12*3 indices starting at 0 -> 12 triangles -> 6 squares
glfwPollEvents();
// put the stuff we've been drawing onto the display
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}
我查看了其他类似的 questions,并将以下内容添加到我的代码中但无济于事。
glewExperimental = GL_TRUE;
glewInit();
这是我机器的规格(如果有帮助的话):
- 它 运行 在 MS Windows 10.
上
- 我的 IDE 是 Visual Studio 2019
- 所有库都已正确安装。
这一直是一个简单的错误 - 在我的 GLFWInit
函数中,在实际创建 window 之前调用了以下行。
glewExperimental = GL_TRUE;
glewInit();
将这些行放在 return window
之前但在 glfwMakeContextCurrent(window)
之后可以使它现在完美运行。感谢您的帮助。
window创建、上下文激活和扩展加载的顺序错误。
在您的代码中,您首先尝试创建 window,然后在不检查是否成功的情况下尝试加载扩展(首先没有激活上下文),然后执行上下文激活。 *除了 window 的创作,你的一切都是倒过来的。
您的代码崩溃了,因为您试图加载 OpenGL 扩展,而上下文在当前线程上没有处于活动状态。没有活动上下文,您将无法加载扩展。 在 Microsoft Windows 上,加载扩展的地址特定于每个上下文,因此严格来说 Windows 你必须为你创建的每个单独的上下文加载扩展!
但是,如果没有活动的上下文,扩展加载就会失败,函数的指针将保持未初始化状态或设置为空指针。因此调用它们时崩溃。
正确的顺序是
// Create window and check for failure
GLFWwindow *const window = glfwCreateWindow(
1024, 768,
"Tutorial 01",
NULL, NULL );
if( !window ){
printf("Failed to create window context.\n");
return NULL;
}
// activate context on current thread
glfwMakeContextCurrent(window);
// Initialize GLEW
glewExperimental = GL_TRUE;
glewInit();
当我 运行 以下代码时,我从行 glGenVertexArrays(1, &VertexArrayID);
中得到一个错误,抱怨 Access violation
。我知道这个错误是由 NULL
指针引起的,但我的 GLuint
不应该。
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <gl/GL.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
static const GLfloat g_vertex_buffer_data[] = {
-1.0f,-1.0f,-1.0f, // triangle 1 : begin
-1.0f,-1.0f, 1.0f,
-1.0f, 1.0f, 1.0f, // triangle 1 : end
1.0f, 1.0f,-1.0f, // triangle 2 : begin
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f, // triangle 2 : end
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f
};
static const GLfloat g_color_buffer_data[] = {
0.583f, 0.771f, 0.014f,
0.609f, 0.115f, 0.436f,
0.327f, 0.483f, 0.844f,
0.822f, 0.569f, 0.201f,
0.435f, 0.602f, 0.223f,
0.310f, 0.747f, 0.185f,
0.597f, 0.770f, 0.761f,
0.559f, 0.436f, 0.730f,
0.359f, 0.583f, 0.152f,
0.483f, 0.596f, 0.789f,
0.559f, 0.861f, 0.639f,
0.195f, 0.548f, 0.859f,
0.014f, 0.184f, 0.576f,
0.771f, 0.328f, 0.970f,
0.406f, 0.615f, 0.116f,
0.676f, 0.977f, 0.133f,
0.971f, 0.572f, 0.833f,
0.140f, 0.616f, 0.489f,
0.997f, 0.513f, 0.064f,
0.945f, 0.719f, 0.592f,
0.543f, 0.021f, 0.978f,
0.279f, 0.317f, 0.505f,
0.167f, 0.620f, 0.077f,
0.347f, 0.857f, 0.137f,
0.055f, 0.953f, 0.042f,
0.714f, 0.505f, 0.345f,
0.783f, 0.290f, 0.734f,
0.722f, 0.645f, 0.174f,
0.302f, 0.455f, 0.848f,
0.225f, 0.587f, 0.040f,
0.517f, 0.713f, 0.338f,
0.053f, 0.959f, 0.120f,
0.393f, 0.621f, 0.362f,
0.673f, 0.211f, 0.457f,
0.820f, 0.883f, 0.371f,
0.982f, 0.099f, 0.879f
};
GLFWwindow* GLFWInit()
{
if (!glfwInit())
{
fprintf(stderr, "Failed to initialize GLFW\n");
}
glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want OpenGL 3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // We don't want the old OpenGL
GLFWwindow* window; // (In the accompanying source code, this variable is global for simplicity)
window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
glewExperimental = GL_TRUE;
// Initialize GLEW to setup the OpenGL Function pointers
glewInit();
if (window == NULL) {
printf("Failed to create window context.\n");
}
glfwMakeContextCurrent(window); // Initialize GLEW
return window;
}
int main()
{
GLFWwindow* window = GLFWInit();
//vertex shader ID array setup:
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
// some other code
while (!glfwWindowShouldClose(window)) {
// wipe the drawing surface clear
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// update other events like input handling
glDrawArrays(GL_TRIANGLES, 0, 12 * 3); // 12*3 indices starting at 0 -> 12 triangles -> 6 squares
glfwPollEvents();
// put the stuff we've been drawing onto the display
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}
我查看了其他类似的 questions,并将以下内容添加到我的代码中但无济于事。
glewExperimental = GL_TRUE;
glewInit();
这是我机器的规格(如果有帮助的话):
- 它 运行 在 MS Windows 10. 上
- 我的 IDE 是 Visual Studio 2019
- 所有库都已正确安装。
这一直是一个简单的错误 - 在我的 GLFWInit
函数中,在实际创建 window 之前调用了以下行。
glewExperimental = GL_TRUE;
glewInit();
将这些行放在 return window
之前但在 glfwMakeContextCurrent(window)
之后可以使它现在完美运行。感谢您的帮助。
window创建、上下文激活和扩展加载的顺序错误。
在您的代码中,您首先尝试创建 window,然后在不检查是否成功的情况下尝试加载扩展(首先没有激活上下文),然后执行上下文激活。 *除了 window 的创作,你的一切都是倒过来的。
您的代码崩溃了,因为您试图加载 OpenGL 扩展,而上下文在当前线程上没有处于活动状态。没有活动上下文,您将无法加载扩展。 在 Microsoft Windows 上,加载扩展的地址特定于每个上下文,因此严格来说 Windows 你必须为你创建的每个单独的上下文加载扩展!
但是,如果没有活动的上下文,扩展加载就会失败,函数的指针将保持未初始化状态或设置为空指针。因此调用它们时崩溃。
正确的顺序是
// Create window and check for failure
GLFWwindow *const window = glfwCreateWindow(
1024, 768,
"Tutorial 01",
NULL, NULL );
if( !window ){
printf("Failed to create window context.\n");
return NULL;
}
// activate context on current thread
glfwMakeContextCurrent(window);
// Initialize GLEW
glewExperimental = GL_TRUE;
glewInit();