OpenGL glGenVertexArray()异常 我现在用C++学习OpenGL,使用SDL、GLW和GLM。我已经到了“VAO和VBO”阶段。然而,我得到了一个错误。当我运行我的程序时,我在LearningOpenGL.exe:0xC0000005:访问冲突执行位置0x00000000中的0x74DECB49处得到一个异常:未处理的异常。有一个箭头指向行glgenvertexarray,我初始化了SDL,创建了一个OpenGL上下文,并使用OpenGL 3.0+
这里是Display.cpp(初始化所有内容) 这是Game.cppOpenGL glGenVertexArray()异常 我现在用C++学习OpenGL,使用SDL、GLW和GLM。我已经到了“VAO和VBO”阶段。然而,我得到了一个错误。当我运行我的程序时,我在LearningOpenGL.exe:0xC0000005:访问冲突执行位置0x00000000中的0x74DECB49处得到一个异常:未处理的异常。有一个箭头指向行glgenvertexarray,我初始化了SDL,创建了一个OpenGL上下文,并使用OpenGL 3.0+,c++,opengl,sdl,glew,C++,Opengl,Sdl,Glew,这里是Display.cpp(初始化所有内容) 这是Game.cpp #include "Game.h" Game::Game() { _display = Display(_displayWidth, _displayHeight, _displayTitle); // TODO: Fix Hardcoded 3 below _vertices[0] = Vertex(glm::vec3(-1.0f, -1.0f, 0.0f)); _vertices[1]
#include "Game.h"
Game::Game()
{
_display = Display(_displayWidth, _displayHeight, _displayTitle);
// TODO: Fix Hardcoded 3 below
_vertices[0] = Vertex(glm::vec3(-1.0f, -1.0f, 0.0f));
_vertices[1] = Vertex(glm::vec3(1.0f, -1.0f, 0.0f));
_vertices[2] = Vertex(glm::vec3(0.0f, 1.0f, 0.0f));
_mesh = Mesh(_vertices, 3);
}
Game::~Game()
{
}
void Game::init()
{
_display.createDisplay();
}
void Game::gameLoop()
{
while (!_display.isClosed())
{
glClearColor(0.0f, 0.15f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
_mesh.render();
_display.update();
}
_display.destroyDisplay();
}
void Game::start()
{
init();
gameLoop();
}
我读过关于这个问题的其他帖子,它们的解决方案似乎是“设置glewExperimental=GL_TRUE”。正如您所看到的,我这样做了,但仍然是例外。当我将旧的图形管道与OpenGL一起使用时,它起了作用。然而,现在情况并非如此。我使用的是OpenGL 3.0+,那么问题出在哪里?您是否按正确的顺序调用这些类过程?比如它真的在生成数组之前创建了上下文吗?我也有同样的问题,这就是原因。
如果您有一段时间没有更新图形驱动程序,您也可以尝试更新图形驱动程序。崩溃数据表明,
glgenvertexarray()
函数不可用,这很可能是您的GLEW/SDL设置有问题
然而,代码中还有一个微妙但非常关键的问题。我不认为它会导致崩溃,但它肯定会阻止它工作。这条线是:
_mesh = Mesh(_vertices, 3);
在这里,将(新构造的)网格
实例指定给变量。这条线上发生的情况如下:
网格
对象\u mesh
变量。由于您的Mesh
类未定义赋值运算符,因此将使用默认的按成员赋值Mesh
实例仅存在于语句中,因此它将被销毁\u mesh
变量的成员中,但该id现在无效
<> > C++类中的OPENL对象通常会导致麻烦,如果你对C++没有把握,并且完全理解如何实现正确的拷贝和赋值语义。
我在这里对类似问题的回答中详细阐述了解决此类问题的一些选项:。最直接的方法是不允许复制这些类型的对象,并在整个代码中使用(智能)指针引用它们。好吧,从目前发布的代码来看,我一点也不清楚您是否使用OpenGL>=3.0。你当然不会在任何地方要求它。所以确保你真的得到了。另一个选项是在创建上下文(并初始化glew)之前调用网格构造函数。它输出:3.1.0构建8.15.10.2618;我还将更新上面的问题以显示我的游戏类。
#include "Game.h"
Game::Game()
{
_display = Display(_displayWidth, _displayHeight, _displayTitle);
// TODO: Fix Hardcoded 3 below
_vertices[0] = Vertex(glm::vec3(-1.0f, -1.0f, 0.0f));
_vertices[1] = Vertex(glm::vec3(1.0f, -1.0f, 0.0f));
_vertices[2] = Vertex(glm::vec3(0.0f, 1.0f, 0.0f));
_mesh = Mesh(_vertices, 3);
}
Game::~Game()
{
}
void Game::init()
{
_display.createDisplay();
}
void Game::gameLoop()
{
while (!_display.isClosed())
{
glClearColor(0.0f, 0.15f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
_mesh.render();
_display.update();
}
_display.destroyDisplay();
}
void Game::start()
{
init();
gameLoop();
}
_mesh = Mesh(_vertices, 3);