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



我正在尝试从这个网站学习现代OpenGL,我目前正在使用顶点数组。我知道我们可以通过使用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如何在没有程序员帮助的情况下创建一个对象?

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

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

该值必须是顶点数,而您传递的大小(以字节为单位)。

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

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

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

要获得后者,请写:

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

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

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

在这种情况下,"

元素"似乎意味着"三角形",这就是3的意思;每个顶点有三个float,所以我们需要将float的数量除以三,得到要绘制的三角形的数量。

另请注意,sizeof不是一个函数。

相关内容

最新更新