glGenVertexArrays调用导致程序崩溃

14

我正在尝试学习OpenGL编程,并使用这个教程。教程1正常运行,但教程2会崩溃并返回1。

它在这个部分失败了:

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

具体来说:

glGenVertexArrays(1, &VertexArrayID);

有什么建议吗?另外也有相关但未解决的问题:OpenGL,FreeGlut和Glew在调用glGenVertexArrays时崩溃


你有遵循教程中的建议吗?在窗口创建后(即 OpenGL 上下文创建后)和任何其他 OpenGL 调用之前执行此操作。 - emartel
@emartel 我复制了教程的源代码,但仍然无法工作。 - asbumste
我明白了,那很抱歉,我不是OpenGL的专家:( - emartel
1
glGetString(GL_VERSION) 返回什么? - genpfault
3个回答

19

在阅读了这个帖子之后,似乎调用

glewExperimental = GL_TRUE; 
glewInit();

阅读glewExperimental的相关信息here,可以解决此问题。文中指出,GLEW从显卡驱动程序获取支持的扩展信息。然而,实验版或预发布版驱动程序可能不会通过标准机制上报每个可用的扩展,这种情况下,GLEW将报告其不受支持。为了避免这种情况,可以在调用glewInit()之前将glewExperimental全局开关设置为GL_TRUE,以确保所有具有有效入口点的扩展都将被公开。

我不太确定它如何帮助glGenVertexArrays,但值得一试。


2
哇,GLEW的修辞技巧堪比政治家。基本上,虽然我们已经使用核心配置OpenGL上下文3年了,但GLEW并不真正支持它们。他们在其中有一个黑客方法,用于切换任何阻止他们执行其他GL加载器可以轻松执行而无需显式切换的操作。就我个人而言,我会建议您停止使用GLEW,因为多年来他们一直没有能够解决这个问题。 - Nicol Bolas
谢谢,这个方法可行。如果GLEW会这么糟糕,我可能不会使用它了。 - asbumste
谢谢你的快速修复。现在我要开始将glew从我的项目中删除了。 - 3Dave

1

将您的glew更新至2.0.0。这是由于此错误引起的。


这在我的glew 2.1.0上发生了。glewExperimental = GL_TRUE解决了它。 - quinn

0

在nvidia GPU和GLEW上使用OpenGL 4.3,这个技巧仍然有效。

我能够使用这个修复方法来运行第8版4.3章第1节中的“我们的第一个程序:详细讨论”。

注释掉

glewExperimental = GL_TRUE; 

结果导致未处理的异常,所以我相当确定这是问题所在。将其添加回代码中,程序将按预期运行。

更新答案以澄清原始答案的新内容:

[1] 请注意,原始答案的日期已经超过两年了,因此我验证了在较新版本的OpenGL中仍然有效。网络上OpenGL示例代码的一个主要问题是教程内容的老化,可能仍然有效,但不被视为最佳实践或最高效的路径。当我阅读原始答案时,我的想法是:

“好吧,但这已经两年了... GLEW还没有更新,这个答案已经过时了吗?”因此,现在读者将知道截至2014年9月13日,它确实是正确的。

[2] 我希望许多读者尝试运行OpenGL程序员指南中非常简单的第一个示例,但如果没有这个修复程序,它将无法运行。通过包含书名,我希望他们能在网上搜索到这个答案。

[3] 我指定了我确定这个工作的平台,以澄清我没有在所有平台上进行测试。


2
这与被接受的答案有何不同?如果您希望添加细节,可以编辑答案并加以扩展。或者您可以留下评论,要求澄清或提供新的见解。 - EWit
如果您注意到原始答案上的数据已经超过两年,那么我验证了在较新版本的OpenGL中仍然是正确的。 - atlake
谢谢您的验证。不过,对已接受答案进行评论或编辑就足够了,因为并非每个访问者都会向下滚动阅读所有答案,所以您的验证很可能被很多人忽略。 - EWit

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