我正在尝试从这个网站学习现代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
不是一个函数。