使用索引缓冲区对象时出现奇怪的分段错误
Strange Segfault when using Index Buffer Objects
使用glDrawArrays时,我的代码运行良好,但每当我创建索引缓冲区并将其更改为使用glDrawElements时,它都会出错。
(奇怪的是,不是在绘图之前或之后……而是当主循环退出时!)
这是简单的代码。。其中我声明了4个顶点,以及3个用于绘制三角形的索引。
int main()
{
sf::Window win(sf::VideoMode(400,400,32),"Manasij");
GlewInit();
mm::Program program
(
{
mm::Shader(GL_VERTEX_SHADER,"vshader.vert"),
mm::Shader(GL_FRAGMENT_SHADER,"fshader.frag")
}
);
float vdata[]=
{
0.0f,0.0f,
0.5f,0.0f,
0.5f,0.5f,
0.0f,0.5f
};
GLubyte indices[]={0,1,3};
GLuint vao,vbo,ebo;
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,8*sizeof(float),vdata,GL_STATIC_DRAW);
glGenBuffers(1,&ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,3*sizeof(GLubyte),indices,GL_STATIC_DRAW);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(0);
glBindAttribLocation(program.getHandle(),0,"pos");
//glBindVertexArray(0);
glUseProgram(program.getHandle());
//glBindVertexArray(vao);
glClearColor(1.0f,1.0f,1.0f,1.0f);
while(win.isOpen())
{
sf::Event eve;
while(win.pollEvent(eve))
if(eve.type==sf::Event::Closed)
win.close();
glClear(GL_COLOR_BUFFER_BIT);
// glDrawArrays(GL_TRIANGLES,0,3);
glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_BYTE,(GLvoid*)0);
win.display();
}
return 0;
}
着色器非常简单:
#version 330
in vec2 pos;
void main()
{
gl_Position = vec4(pos,0.0f,1.0f);
}
和
#version 330
void main()
{
gl_FragColor = vec4(1.0f,0.3f,0.8f,1.0f);
}
gdb显示:
Breakpoint 1, main () at test.cpp:57
57 win.display();
(gdb) continue
Continuing. //<- At this point I try to close the window, thus triggeing the main loop to break
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff557d164 in ?? () from /lib/libnvidia-glcore.so.302.17
知道我搞砸了什么吗?
附言:如果有人想测试,这里有一个档案。。完成一个makefile!
https://docs.google.com/file/d/0B0oubbp-MVYOeGFuX0owXzhRTEU/edit
问题是,在循环的最后一次迭代中,当检测到"关闭"事件时,窗口会被通知关闭,但即使在那之后,我还是最后一次调用glDrawElements。既然一切都已经过去了,那就导致了一场混乱。
解决方案是在调用win.close()之后放入break语句,或者将事件处理代码放在循环的末尾。
(感谢来自archlinux论坛的cmtptr捕捉到了这一点,我几乎确信这是一个驱动程序问题)
绘制循环结束后,尝试删除VertexArrays
和Buffers
:
while(win.isOpen())
{
sf::Event eve;
while(win.pollEvent(eve))
if(eve.type==sf::Event::Closed)
win.close();
glClear(GL_COLOR_BUFFER_BIT);
// glDrawArrays(GL_TRIANGLES,0,3);
glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_BYTE,(GLvoid*)0);
win.display();
}
glDeleteBuffer(1, &ebo);
glDeleteVertexArrays(1, &vbo);
return 0;
这只是一个猜测,如果有区别,请告诉我。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?