我是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);
答案 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()时你没有指定数组中元素的数量,你指定了坐标的数量,在这种情况下它们是四个。