Opengl 尝试使用VBO绘制圆柱体时未处理的异常/访问冲突读取位置

Opengl 尝试使用VBO绘制圆柱体时未处理的异常/访问冲突读取位置,opengl,vbo,Opengl,Vbo,我正试图用VBOs绘制一个圆柱体,我被这个访问冲突所困扰。 这是代码(针对示例格式化): 上面的函数只是用法向量和顶点填充数组 void drawCylinder() { GLuint buffers[2]; glGenBuffers(2, buffers); glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); glBufferData(GL_ARRAY_BUFFER, 144*N, vertexArray, GL_STATIC_DRAW); glBindBu

我正试图用VBOs绘制一个圆柱体,我被这个访问冲突所困扰。 这是代码(针对示例格式化):

上面的函数只是用法向量和顶点填充数组

void drawCylinder() {
GLuint buffers[2];
glGenBuffers(2, buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, 144*N, vertexArray, GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER,buffers[1]);
glBufferData(GL_ARRAY_BUFFER, 144*N, normalArray, GL_STATIC_DRAW);

glVertexPointer(3,GL_FLOAT,0,vertexArray);
glNormalPointer(GL_FLOAT,0,normalArray);
glDrawArrays(GL_TRIANGLES, 0, 12*N);
}
在glDrawArrays调用中引发异常。我在GLUT的显示回调函数(renderfunc)中调用drawCylinder()。主要功能如下所示:

void main(int argc, char **argv) {

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("Glew - VBOs - Cylinder");

glutDisplayFunc(renderfunc);
glutIdleFunc(renderfunc);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

fillArrays(3,1,20);
glutMainLoop();
}
我的代码可能有各种各样的问题,我刚刚开始使用VBOs(以及OpenGLlibs)。但是抛出此异常有明显的原因吗?我正在使用VisualStudio,正如我所说的,调用glDrawArrays时显然会检测到访问冲突

glVertexPointer(3,GL_FLOAT,0,vertexArray);
glNormalPointer(GL_FLOAT,0,normalArray);
如果使用VBOs,则
gl*Pointer()
Pointer
参数应该是缓冲区中的偏移量,而不是本机指针。本机指针用于顶点数组

此外,在每次绘制调用之前重新上载顶点数据在某种程度上违背了VBOs的目的,尤其是使用
GL\u STATIC\u draw
提示


这是一个不错的VBO示例。

关于genpfault的答案:

在GLUT的显示回调函数中调用drawCylinder()

drawCylinder
中创建/绑定缓冲区

假设您创建了一个键盘交互旋转,每次按下一个键旋转对象时,都会绑定一个新的缓冲区。最终,内存将被耗尽,并可能导致一些堆栈溢出


您可以创建一个
init()
函数,将缓冲区初始化代码抛出到
init()
并在
glutDisplayFunc()

之前调用。谢谢,我现在就得到了它。那个教程真的很有帮助!
glVertexPointer(3,GL_FLOAT,0,vertexArray);
glNormalPointer(GL_FLOAT,0,normalArray);