2

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

4

2 回答 2

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

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

此外,在每次绘制调用之前重新上传您的顶点数据在某种程度上违背了 VBO 的目的,尤其是在GL_STATIC_DRAW提示的情况下。

是一个不错的 VBO 示例。

于 2012-04-30T22:56:33.607 回答
0

关于 genpfault 的回答:

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

drawCylinder您创建/绑定缓冲区的内部?

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

您可以创建一个init()函数抛出缓冲区初始化代码init()并在您之前调用glutDisplayFunc()

于 2012-10-25T16:53:12.403 回答