未处理的异常,对 glGenVertexArrays 调用的访问冲突
Unhandled exception, Access violation on glGenVertexArrays call
我目前在 Windows 8 上遇到 OpenGL 开发的一些问题。我正在为一个在 Linux 中工作的项目设置 OpenGL。
我们在这个项目中同时使用了 glfw 和 glew。
我的实际问题是 glGenVertexArrays 为空,当调用它时它崩溃了,我遇到了访问冲突。 glGenVertexArrays 不是第一个使用 glew 的 gl 调用。
我按照本教程使用 win32 库将 glew 和 glfw 链接到 visual studio 项目:http://www.41post.com/5178/programming/opengl-configuring-glfw-and-glew-in-visual-cplusplus-express
以下代码为初始化代码:
glfwSetErrorCallback(error_callback);
if (!glfwInit())
{
LOG_FATAL << "Failed to init glfw context";
exit(EXIT_FAILURE);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
m_window = glfwCreateWindow(1240, 480, "Rubix", NULL, NULL);
if (!m_window)
{
glfwTerminate();
LOG_FATAL << "Failed to create glfw window";
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(m_window);
#ifdef WIN32
//glewExperimental = GL_TRUE;
GLenum glewinit = glewInit();
if (glewinit != GLEW_OK)
{
std::cout << "Glew not okay! " << glewinit;
exit(EXIT_FAILURE);
}
#endif
glfwSwapInterval(1);
glfwSetKeyCallback(m_window, key_callback);
LOG_INFO << "glfw OpenGL context ready";
initGL();
调用以下代码显示立方体:
float points[] = {
0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f
};
float normals[] = {
0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f
};
unsigned short index_array[] = {
0, 3, 2,
0, 2, 1,
0, 1, 5,
0, 5, 4,
1, 2, 6,
1, 6, 5,
2, 3, 7,
2, 7, 6,
3, 0, 4,
3, 4, 7,
4, 5, 6,
4, 6, 7,
};
GLuint points_vbo;
glGenBuffers (1, &points_vbo);
glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), points, GL_STATIC_DRAW);
GLuint normals_vbo;
glGenBuffers (1, &normals_vbo);
glBindBuffer (GL_ARRAY_BUFFER, normals_vbo);
glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), normals, GL_STATIC_DRAW);
GLuint index_buffer_object;
glGenBuffers (1, &index_buffer_object);
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, index_buffer_object);
glBufferData (GL_ELEMENT_ARRAY_BUFFER, 48 * sizeof (unsigned short), index_array, GL_STATIC_DRAW);
glGenVertexArrays (1, &m_vao);
glBindVertexArray (m_vao);
glEnableVertexAttribArray (0);
glEnableVertexAttribArray (1);
glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer (GL_ARRAY_BUFFER, normals_vbo);
glVertexAttribPointer (1, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_object);
glBindVertexArray(0);
// Creating program
Program program;
program.emplace_back("pos.vert", GL_VERTEX_SHADER);
program.emplace_back("smooth.frag", GL_FRAGMENT_SHADER);
program.link();
program.clearShaders();
m_program = program.getProgram();
我确实尝试了 glewExperimental = GL_TRUE;使用此代码运行,但不显示任何内容。
我使用的 gpu 是 nvidia GT 730M,它支持最高 4.2 的 opengl。
我也 运行 glewinfo.exe 说 glGenVertexArrays 应该没问题。
我还注意到,当我在 Windows 工具包下的 gl 文件夹中打开 glcorearb.h 位于(visual studio 2013)时,opengl 中的大多数版本都显示为灰色,我认为问题可能链接到那个。
您的代码不会检查是否满足所需的运行时先决条件,因此如果存在不充足的 OpenGL 环境,它不会捕捉到这种情况。很可能是 OpenGL 驱动程序安装不正确,这就是 GLEW 无法初始化您需要的函数指针的原因。
请注意,Microsoft 正在破坏 OpenGL,并在通过 Windows 更新或初始 Windows 设置安装的驱动程序中删除了 OpenGL ICD。请仔细检查,您直接从 NVidia 网站下载的驱动程序是否已正确安装。
好的,问题是 visual studio 没有使用正确的 GPU。为了修复它,我进入了 Nvidia 控制面板 -> 管理 3D 设置 -> 程序设置并添加了我的调试 exe 和发布 exe。
之后它不起作用的原因是我忘记将 glewExperimental 设置为 true 来尝试它。
设置完两者后我的问题就解决了。
我目前在 Windows 8 上遇到 OpenGL 开发的一些问题。我正在为一个在 Linux 中工作的项目设置 OpenGL。
我们在这个项目中同时使用了 glfw 和 glew。
我的实际问题是 glGenVertexArrays 为空,当调用它时它崩溃了,我遇到了访问冲突。 glGenVertexArrays 不是第一个使用 glew 的 gl 调用。
我按照本教程使用 win32 库将 glew 和 glfw 链接到 visual studio 项目:http://www.41post.com/5178/programming/opengl-configuring-glfw-and-glew-in-visual-cplusplus-express
以下代码为初始化代码:
glfwSetErrorCallback(error_callback);
if (!glfwInit())
{
LOG_FATAL << "Failed to init glfw context";
exit(EXIT_FAILURE);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
m_window = glfwCreateWindow(1240, 480, "Rubix", NULL, NULL);
if (!m_window)
{
glfwTerminate();
LOG_FATAL << "Failed to create glfw window";
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(m_window);
#ifdef WIN32
//glewExperimental = GL_TRUE;
GLenum glewinit = glewInit();
if (glewinit != GLEW_OK)
{
std::cout << "Glew not okay! " << glewinit;
exit(EXIT_FAILURE);
}
#endif
glfwSwapInterval(1);
glfwSetKeyCallback(m_window, key_callback);
LOG_INFO << "glfw OpenGL context ready";
initGL();
调用以下代码显示立方体:
float points[] = {
0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f
};
float normals[] = {
0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f
};
unsigned short index_array[] = {
0, 3, 2,
0, 2, 1,
0, 1, 5,
0, 5, 4,
1, 2, 6,
1, 6, 5,
2, 3, 7,
2, 7, 6,
3, 0, 4,
3, 4, 7,
4, 5, 6,
4, 6, 7,
};
GLuint points_vbo;
glGenBuffers (1, &points_vbo);
glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), points, GL_STATIC_DRAW);
GLuint normals_vbo;
glGenBuffers (1, &normals_vbo);
glBindBuffer (GL_ARRAY_BUFFER, normals_vbo);
glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), normals, GL_STATIC_DRAW);
GLuint index_buffer_object;
glGenBuffers (1, &index_buffer_object);
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, index_buffer_object);
glBufferData (GL_ELEMENT_ARRAY_BUFFER, 48 * sizeof (unsigned short), index_array, GL_STATIC_DRAW);
glGenVertexArrays (1, &m_vao);
glBindVertexArray (m_vao);
glEnableVertexAttribArray (0);
glEnableVertexAttribArray (1);
glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer (GL_ARRAY_BUFFER, normals_vbo);
glVertexAttribPointer (1, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_object);
glBindVertexArray(0);
// Creating program
Program program;
program.emplace_back("pos.vert", GL_VERTEX_SHADER);
program.emplace_back("smooth.frag", GL_FRAGMENT_SHADER);
program.link();
program.clearShaders();
m_program = program.getProgram();
我确实尝试了 glewExperimental = GL_TRUE;使用此代码运行,但不显示任何内容。
我使用的 gpu 是 nvidia GT 730M,它支持最高 4.2 的 opengl。
我也 运行 glewinfo.exe 说 glGenVertexArrays 应该没问题。 我还注意到,当我在 Windows 工具包下的 gl 文件夹中打开 glcorearb.h 位于(visual studio 2013)时,opengl 中的大多数版本都显示为灰色,我认为问题可能链接到那个。
您的代码不会检查是否满足所需的运行时先决条件,因此如果存在不充足的 OpenGL 环境,它不会捕捉到这种情况。很可能是 OpenGL 驱动程序安装不正确,这就是 GLEW 无法初始化您需要的函数指针的原因。
请注意,Microsoft 正在破坏 OpenGL,并在通过 Windows 更新或初始 Windows 设置安装的驱动程序中删除了 OpenGL ICD。请仔细检查,您直接从 NVidia 网站下载的驱动程序是否已正确安装。
好的,问题是 visual studio 没有使用正确的 GPU。为了修复它,我进入了 Nvidia 控制面板 -> 管理 3D 设置 -> 程序设置并添加了我的调试 exe 和发布 exe。
之后它不起作用的原因是我忘记将 glewExperimental 设置为 true 来尝试它。
设置完两者后我的问题就解决了。