OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法

以下内容来自: 
1、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社

2、自己的总结


四边形的绘制简易房屋的绘制中可以看到,几何体都是先定义顶点,然后给顶点赋属性,再定义图元,将几何体添加到叶节点中进行渲染,图形就绘制完成。

所以,几何体的核心在于几何元素,几何元素使用顶点属性来表达。从例子中可以看到,顶点的属性不是一个值,而是由其空间坐标值、法线、颜色坐标、纹理坐标、雾坐标等所组成的一个集合。


根据定义的图元,对顶点进行渲染,一般有四种方式。通常情况下,渲染方式有:启用顶点数组(Vertex Array, VA)启用显示列表(Display List, DL)启用顶点缓存对象(Vertex Buffer Objects, VBO),这三种方式对顶点都进行了一定程度的优化,称为“快速渲染通道”;如果不采取任何优化措施,顶点的处理会变得冗余,场景绘制效率会大幅度降低,称为“低速渲染通道”,如果用户的显示设备配置不足,则需要使用这种渲染方式,又称为立即模式


顶点数组(Vertex Array,VA)

避免多次调用立即模式的glVertex()(OpenGL设置顶点的空间坐标)等顶点设置函数而造成的冗余和低效。通过多个数组来存储与顶点属性相关的数据,并且避免了对共用顶点的冗余处理。

在例子中,使用DrawArrays()来从启用的数组直接构建图元;也可以用DrawElements()来执行相同的绘制工作,它支持顶点索引的机制。顶点索引就是把输入的顶点坐标值从0开始编号,并在一个单独的无符号类型数组中保存多个索引值组成的图元信息,从而进一步避免了重复指定顶点数据造成的冗余。


显示列表(Display List,DL)

将一组OpenGL函数调用保存起来,并在需要的时候直接提取内存中的数据进行调用。在反复绘制相同或类似(如椭球体)对象时,将同一组绘制椭球体的命令构成显示列表,再分别赋予适当的空间变换即可完成,这样省去了重新计算和设置属性点属性的过程,降低了重复传递数据所造成的影响。

但是它只是一种高速缓存,因此并不是动态的,因此显示列表中的数据不能动态修改。在动态模型中,如果要修改顶点或者图元,就必须销毁并重建相应的显示列表,这样反而降低了动态模型绘制的性能。


顶点缓存对象(Vertex Buffer Object,VBO)

需要显卡支持GL_ARB_vertex_buffer_object扩展,现在的显卡基本都支持。其初衷是结合上述两种方式的优点,并尽量减少它们的缺点带来的影响。

VBO扩展允许将顶点数组保存到显示系统的高速缓存中,并且对于大规模的顶点数据,内置的内存管理机制可以自动在系统内存、显卡缓存和AGP三者之间进行平衡处理,将用户数据保存到最合理的地方。

它的重要特性是:可以直接将显卡缓存的数据映射到用户空间,因此能够支持动态数据更新,并且不会过多影响客户端和服务器之间的传输效率。

例如就使用了这种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值