glDrawArrays如何知道要绘制什么?

时间:2013-09-30 19:26:14

标签: opengl graphics rendering vertex

我正在关注一些初学者的OpenGL教程,对这段代码感到有些困惑:

glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); //Bind GL_ARRAY_BUFFER to our handle
glEnableVertexAttribArray(0); //?
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); //Information about the array, 3 points for each vertex, using the float type, don't normalize, no stepping, and an offset of 0. I don't know what the first parameter does however, and how does this function know which array to deal with (does it always assume we're talking about GL_ARRAY_BUFFER?

glDrawArrays(GL_POINTS, 0, 1); //Draw the vertices, once again how does this know which vertices to draw? (Does it always use the ones in GL_ARRAY_BUFFER)

glDisableVertexAttribArray(0); //?
glBindBuffer(GL_ARRAY_BUFFER, 0); //Unbind

我不明白glDrawArrays如何知道要绘制哪些顶点,以及glEnableVertexAttribArray所做的所有事情是什么。有人可以对这种情况有所了解吗?

2 个答案:

答案 0 :(得分:38)

glBindBuffer的调用告诉OpenGL在需要vertexBufferObject时使用GL_ARRAY_BUFFER

glEnableVertexAttribArray表示您希望OpenGL使用顶点属性数组;如果没有此调用,您提供的数据将被忽略。

正如你所说,

glVertexAttribPointer告诉OpenGL如何处理提供的数组数据,因为OpenGL本身并不知道数据的格式。

glDrawArrays使用以上所有数据来绘制点数。

请记住,OpenGL是一个大型状态机。大多数对OpenGL函数的调用都会修改您无法直接访问的全局状态。这就是代码以glDisableVertexAttribArrayglBindBuffer(..., 0)结尾的原因:当你完成使用它时,你必须把这个全局状态放回去。

答案 1 :(得分:3)

DrawArrays从ARRAY_BUFFER获取数据。

根据您在glVertexAttribPointer中的设置来“映射”数据,它会告诉您顶点的定义。

在您的示例中,您在位置0处有一个顶点attrib(glEnableVertexAttribArray)(通常可以有16个顶点属性,每个4个浮点数)。 然后你告诉每个属性将通过从位置0开始从缓冲区读取3个GL_FLOATS来获得。

这里很棒的教程:http://www.arcsynthesis.org/gltut/Basics/Tut02%20Vertex%20Attributes.html