一.综述
三角形是图形学中最重要的形状,任何图形,无论是多边形,甚至圆形都可以被近似成多个三角形,所以,在底层的数据中我们怎么组织和存储三角形的信息,诸如顶点,位置,法向量等,效率的高低会直接关系到我们渲染效果的好坏。
二.表示三角形网格
1.三角形的一个点包含的信息可能有:一个float3的值表示位置信息,法向量,材质信息
2.一个三角形有三个点,怎么组织和索引这三个点,才能尽可能的使我们尽可能少的存储重复的数据
三.几种存储和索引方法
思路:大多数时候如果简单的存储和索引单个三角形会降低效率,同一个点可能会被传输多次,数据传输正是cpu和gpu或者说图形硬件的瓶颈,所以优化的思路就是排序点和面,使得缓存中已经存在的三角形和点不要被二次传输
灵活性从高到低依次是:顶点缓存,三角带,三角扇
1.顶点缓存:
缓存的一大原则就是,最近使用数据未来仍将被使用,现在缓存中寻找,找不到发生脱靶则更新缓存。那么如果我们提前组织好顶点的顺序,那么依据这个原则,如果有重复的顶点,则在索引过程中,大概率这个点已经在缓存中,我们不必再继续传输,这个缓存策略可能使发送到显卡的定点数降低到平均每个三角形少于一个
2.三角带:
三角带是一个三角形列表,每个三角形都与前一个三角形共享一边,例:1,2,3构成第一个三角形,2,3,4构成第二个三角形,3,4,5构成第三个三角形,最佳情况下三角带可以用n+2个顶点存储n个面,n很大时,每个三角形平均发送一个顶点
tips:分别渲染两个长为n的三角带所需的时间长于渲染一个长为2n的三角带,所以如果我们将两个这样的三角带连接成一个,便可以大大提高渲染效率,通过建立退化的三角形可以解决这个问题,退化三角形即面积为0的三角形(即一个边),这样可以提升渲染的效率,甚至可以通过一个标志位来标识需不需要绘制这个三角形,避免绘制退化三角形带来的性能问题
3.三角扇:
三角扇就像一个扇子,第一个点被其他所有三角形共享,并不是所有场合都能满足这种情况,不如三角带灵活
四.额外信息
1.纹理映射坐标
通常在顶点保存纹理映射坐标,三角形面中其余各点的坐标通过插值进行计算
2.表面法向量
法向量的作用:(1)计算光照(2)进行背面剔除(3)模拟粒子在表面弹射(4)加速只考虑正面的碰撞检测
法向量的一种计算方式是平均周围的顶点或者面的法向量,但这也存在问题使得尖锐过度的部分变得平滑而显得不真实
3.光照值
五.拓扑和一致性
1.孤立顶点
2.重复顶点
3.退化三角形
4.开放边
5.超过两个三角形共享的边
6.重复面
上述这些异常应该被即使消除,这些可能导致网格不封闭或者索引效率很低
六.三角网格操作
1.逐片操作
逐个三角形进行渲染,如果需要旋转或者缩放三角形顶点则应该逐顶点进行
2.焊接顶点
当两个三角形的其中一边非常接近时,可能是由于误差产生的额外边,或者两个边存在一个就可以,这时候我们需要剔除其中一个,相当于把两个边焊接成一个。
tips:(1)焊接前剔除孤立点
(2)焊接可能产生退化三角形
(3)焊接时如果用两个顶点的平均值作为新顶点,可能会导致不该合并的顶点被合并,违背我们只是想去除重复顶点而不是消减网格
3.面拆分
将两个共用一个边的三角形拆开,增加顶点
4.面坍塌
将两个三角形即一个四边形压缩成一个三角形
5.网格消减
可以通过面坍塌的方式实现,通过消减顶点和网格数量来简化模型数据,提高渲染效率
网友评论