我正在尝试从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在没有程序员帮助的情况下如何创建对象?
答案 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
不是函数。