glDrawArrays()自动绘制一个不需要的对象

时间:2014-11-27 10:47:20

标签: c++ opengl

我正在尝试从this site学习Modern OpenGL,我目前正在使用Vertex数组。我知道我们可以通过对每个顶点使用glDrawArrays而不是glVertex**()来最小化OpenGL函数调用。

从这一点来看,这两个函数都应该产生相同的输出,但是我得到了额外的绘图,而我没有通过glDrawArrays()进行绘制。

以下是代码(顶点和display()

float Triangles[]={
0.0f, 5.0f, 0.0f, 
-5.0f, -5.0f, -4.0f, 
5.0f, -5.0f, -4.0f,

0.0f, 5.0f, 0.0f, 
-5.0f, -5.0f, 4.0f, 
5.0f, -5.0f, 4.0f,

0.0f, 5.0f, 0.0f, 
-5.0f, -5.0f, -4.0f, 
-5.0f, -5.0f, 4.0f,

0.0f, 5.0f, 0.0f, 
5.0f, -5.0f, -4.0f, 
5.0f, -5.0f, 4.0f,};
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.1f, 1.0f, 0.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, Triangles);
glDrawArrays(GL_TRIANGLES, 0, sizeof(Triangles));
glDisableClientState(GL_VERTEX_ARRAY);
glFlush (); // Try commneting glFlush()
}

当我运行该程序时,它会根据编程创建一个3D三角形,但它带有2D方形(我没有编程)。它是什么??我不知道OpenGL在没有程序员帮助的情况下如何创建对象?

2 个答案:

答案 0 :(得分:1)

你的问题在于glDrawArrays()的第三个参数:

glDrawArrays(GL_TRIANGLES, 0, sizeof(Triangles));

当您以字节传递大小时,该值必须是顶点的数量。

由于您有12个顶点,因此参数值应为12.如果要根据数据定义计算它,每个顶点由3个数组元素组成,因此您必须将总大小除以3的大小。数组元素:

glDrawArrays(GL_TRIANGLES, 0, sizeof(Triangles) / (3 * sizeof(Triangles[0]));

答案 1 :(得分:0)

您使用sizeof是错误的。它将为您提供数组的大小(以字节为单位),而不是数组中的顶点数。

要获得后者,请写下:

glDrawArrays(GL_TRIANGLES, 0, sizeof Triangles / (3 * sizeof *Triangles));

[文档]说,关于最终参数(count):

  

当调用glDrawArrays时,它使用每个启用数组中的count个连续元素来构造一系列几何图元,从元素first开始。

似乎"元素"意思是"三角形"在这种情况下,这是3的意思;每个顶点有三个float s,因此我们需要将float s的数量除以三来得到要绘制的三角形数。

另请注意,sizeof不是函数。