[opengl笔记]2017年8月17日

欢迎访问我的网站贴: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();
  1. <font size="1"> obj = getObject(1);
  2. doStuff( obj );
  3. obj = getObject(2);
  4. doStuff( obj );
  5. ...</font>
复制代码
VBOs仅仅是字节的列表,可以是浮点、整型、结构等。GL_ELEMENT_ARRAY_BUFFER可以想象opengl有N个对象的指针或者引用。这个数组有一系列的名字,如GL_ELEMENT_ARRAY_BUFFER
  1. <font size="1"> BufferObject *obj[ 10 ];

  2.   doStuff( obj[0] )
  3.   doStuff( obj[1] )</font>
复制代码
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个定点数据,则如下是对的:
  1. <font size="1">glDrawArrays (GL_QUADS, 0, 4);
  2. glDrawArrays (GL_QUADS, 12, 4);
  3. glDrawArrays (GL_QUADS, 100, 12);</font>
复制代码
使用这个的一个例子是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

glVertexAttribPointer uses the current GL_ARRAY_BUFFER binding. That's your purpose in binding a buffer object to that buffer bind target. Similarly forglDrawElements and GL_ELEMENT_ARRAY_BUFFER.



Modern OpenGL (see slides 7 and 8)
Generic_Vertex_Attribute_-_examples
Modern_OpenGL_Tutorial_03#Interweaving_coordinates _and_colors
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值