以下内容来自:
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三者之间进行平衡处理,将用户数据保存到最合理的地方。
它的重要特性是:可以直接将显卡缓存的数据映射到用户空间,因此能够支持动态数据更新,并且不会过多影响客户端和服务器之间的传输效率。
例如就使用了这种方式。