欢迎访问我的网站贴:http://www.hongwgw.com/image/forum.php?mod=viewthread&tid=2&extra=page%3D1
问题:很多的教程里描述VBO为浮点数或者整数数组,但是由于glBindBuffer有个目标的参数(GL_ELEMENT_ARRAY_BUFFER),所以我认为VBOs有其它的隐含信息。VAOs作为看起来像VBOs的16眼的插座,并且有些教程说shader绑定到一个VAO上。后来我发现VAO像是有什么东西要画一样,但是VAO本身并没有画的函数,必须调用正确的函数如glDrawArrays 或者 glDrawElements,它们没有一个是将VAO作为参数的。如果VBO都做了绑定的事,那么要VAO干什么?或者相反。
回答一:一个概念的命名从两个方面着手要快些1)真正是什么?2)为什么存在
让我们从基础开始。我们重点关注vertex data或者index data需要调用draw
Draw call -> VAO -> Buffer Objects
Draw call=发动一个draw命令使用绑定到VAO上的对象。
VAO =需要画的vertex和index缓冲区对象和其它的一些状态。
Buffer objects =拥有要绘制的数据。
在这个例子中Buffer Objects仅包含vertex和/或index数据,这个缓冲区就是VBO,是一块内存区域。
相比之下,VAOs是绘制命令建立到opengl的状态的捷径,是其它状态的容器。在api层面,下面两点是等价的:1)触发VAOs 2)触发状态A、B、C.......(这些状态由VAO指定)
绑定类似与getObject();
VBOs仅仅是字节的列表,可以是浮点、整型、结构等。GL_ELEMENT_ARRAY_BUFFER可以想象opengl有N个对象的指针或者引用。这个数组有一系列的名字,如GL_ELEMENT_ARRAY_BUFFER
glBindBuffer() 是告诉opengl那一个需要绑定。
VBOs仅仅是一个缓冲对象,是GPU中的一段内存。没有包含其它的信息。
回答二:
VAO's相比其它概念来讲是最年轻的,VBO's 存在VAO's之前。
VAO's 是VBO和其它一些状态的管理信息。你也许有一个VAO用于静态场景,一个VAO用于显示,一VAO用于XYZ,它封装很多的状态信息减少CPU与GPU之间的通信。
shaders上传到GPU中,调用draw()时,由VAOs的定义可以处理VBO数据。
回答三:
VBO与draw()并非一对一的关系,可以只绘制VBO的一部分。
如果VBO有120个定点数据,则如下是对的:
使用这个的一个例子是view frustum culling视锥裁剪
回答四:
不仅VAO获取buffer绑定,而且获取如何传递这些缓冲区对象(通过glVertexAttribPointer 和 gl{Enable,Disable}VertexAttribArray)。
最好的性能是VBO拥有定点的所有性能,如:
* Vertex 0's position, normal, texcoord.
* Vertex 1's position, normal, texcoord.
* Vertex 2's position, normal, texcoord.
The parameters you provide to glVertexAttribPointer,gl{Enable,Disable}VertexAttribArray,glDrawElements, and glDrawArrays tell OpenGL how to interpret the buffer object's you've bound to GL_ARRAY_BUFFER and GL_ELEMENT_ARRAY_BUFFER.
回答五:
- Buffer objects containing vertex attribute data are bound to GL_ARRAY_BUFFER before callingglVertexAttribPointer to set up avertex attribute array binding.
- Buffer objects containing index data are bound GL_ELEMENT_ARRAY_BUFFER to set up an index array bindingbefore calling glDrawElements
Modern OpenGL (see slides 7 and 8)
* Generic_Vertex_Attribute_-_examples
* Modern_OpenGL_Tutorial_03#Interweaving_coordinates _and_colors