61

我正在关注一些初学者的 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。有人可以说明情况吗?

4

2 回答 2

47

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

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

glVertexAttribPointer,正如您所说,告诉 OpenGL 如何处理提供的数组数据,因为 OpenGL 本身并不知道该数据将采用什么格式。

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

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

于 2013-09-30T19:33:24.227 回答
5

DrawArrays 从ARRAY_BUFFER.

根据您的设置“映射”数据,glVertexAttribPointer其中告诉您顶点的定义是什么。

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

于 2013-09-30T19:30:59.787 回答