我正在尝试使用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时显然检测到访问冲突。
答案 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()