我正在关注一些初学者的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
所做的所有事情是什么。有人可以对这种情况有所了解吗?
答案 0 :(得分:38)
对glBindBuffer
的调用告诉OpenGL在需要vertexBufferObject
时使用GL_ARRAY_BUFFER
。
glEnableVertexAttribArray
表示您希望OpenGL使用顶点属性数组;如果没有此调用,您提供的数据将被忽略。
glVertexAttribPointer
告诉OpenGL如何处理提供的数组数据,因为OpenGL本身并不知道数据的格式。
glDrawArrays
使用以上所有数据来绘制点数。
请记住,OpenGL是一个大型状态机。大多数对OpenGL函数的调用都会修改您无法直接访问的全局状态。这就是代码以glDisableVertexAttribArray
和glBindBuffer(..., 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