opengl glDrawArray抛出异常

时间:2011-06-02 13:09:08

标签: c++ opengl-es

我是openGL的新手,我需要直接将它用于调试目的,任何人都可以告诉我为什么在这段代码中glDrawArray应该抛出异常(尝试访问0x00000000处的内存)

glEnableClientState(GL_VERTEX_ARRAY);
float data[8];
data[0] = 10;
data[1] = 10; 
data[2] = 10;
data[3] = 20; 
data[4] = 20;
data[5] = 20; 
data[6] = 20;
data[7] = 10; 
glVertexPointer(2,GL_FLOAT,0,data);
glDrawArrays(GL_LINE_LOOP,0,4);
glDisableClientState(GL_VERTEX_ARRAY);

3 个答案:

答案 0 :(得分:4)

您的glDrawArrays来电相当于:

glBegin(GL_LINE_LOOP);
glVertex2fv(data +  0);
glVertex2fv(data +  2);
glVertex2fv(data +  4);
glVertex2fv(data +  6);
glVertex2fv(data +  8);
glVertex2fv(data + 10);
glVertex2fv(data + 12);
glVertex2fv(data + 14);
glEnd();

所以你肯定试图访问data之外的一些内存。

答案 1 :(得分:2)

也许你已经在程序的另一个点启用了另一个带有glEnableClientState的数组,并没有禁用它。所以glDrawArrays尝试从导致问题的另一个数组中读取。

编辑::也可能是,您向我们展示的代码不是真正的代码,而您在与glVertexPointer完全不同的地方拨打glDrawArrays。将data作为顶点指针时,只有在调用data时才会告诉它从glDrawArrays获取顶点。顶点数据不会被复制,因此data在调用glDrawArrays时必须仍然存在(目前它是一个局部变量,但是你给我们的代码片段应该可以工作)。

编辑:我还假设您没有使用任何缓冲区对象,因为如果在调用glVertexPointer时绑定了顶点缓冲区,这也可能是个问题。

答案 2 :(得分:0)

尝试:

glDrawArrays(GL_LINE_LOOP,0,4);

在你对glVertexPointer()的调用中,你说每个顶点都有两个浮点数。但是在调用glDrawArrays()时你没有指定数组中元素的数量,你指定了坐标的数量,在这种情况下它们是四个。