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

时间:2012-04-30 22:31:54

标签: opengl vbo

我正在尝试使用VBO绘制一个圆柱体而且我遇到了这种访问冲突。 这是代码(为示例格式化):

int N;
float *vertexArray, normalArray;

void fillArrays(float height, float radius, int num) {

N = num;
vertexArray = (float*) malloc(sizeof(float)*36*num);
normalArray = (float*) malloc(sizeof(float)*36*num);
... 
}

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

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();
}

我的代码可能存在各种问题,我刚刚开始使用VBO(以及openGL库)。但有没有明显的理由抛出这个异常?我正在使用Visual Studio,正如我所说,在调用glDrawArrays时显然检测到访问冲突。

2 个答案:

答案 0 :(得分:1)

glVertexPointer(3,GL_FLOAT,0,vertexArray);
glNormalPointer(GL_FLOAT,0,normalArray);

如果您正在使用VBO,gl*Pointer() pointer参数应该是缓冲区的偏移量,而不是本机指针。本地指针用于顶点数组。

此外,在每次绘制调用之前重新上传顶点数据会稍微违背VBO的目的,尤其是GL_STATIC_DRAW提示。

This是一个体面的VBO示例。

答案 1 :(得分:0)

关于genpfault的回答:

  

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

在你创建/绑定缓冲区的drawCylinder内?

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

您可以为init()创建init()函数抛出缓冲区初始化代码,然后在glutDisplayFunc()

之前调用