Unity3D笔记第二十天——3D图形学(网格基础)

来源:互联网 发布:cpu淘宝e5水多深 编辑:程序博客网 时间:2024/06/04 18:58
3D图形学(网格基础)
网格
多边形网格不过是一个多边形列表;三角网格就是全部由三角形组成的多边形网格。多边形和三角网格在图形学和建模中广泛使用,用来模


拟复杂物体的表面,如建筑,车辆,人体,档案还有茶壶。
任意多边形网格都可以转换成三角网格。 Unity支持三角形网格。


  网格包括顶点和多个三角形数组。
 三角形数组仅仅是顶点的索引数值,每个三角形包含三个索引。
 每个顶点可以有一条法线,两个纹理坐标,及颜色和切线。
虽然这些是可选的,但是也可以去掉,所有的顶点信息是被储存在单独的同等规格的数值中,所以如果你的网格有10个顶点,你同样应该有


大小为10的数组来存储法线和其它属性。


修改、创建网格
新建网格: 为顶点数组赋值  为三角形数组赋值
修改顶点属性:  获取顶点数组  修改顶点数组   赋值给网格


顶点缓存
      与其说顶点缓存是一种特殊的存储格式,不如说是API和硬件之间的一种存储策略,用以发挥相续三角形顶点一致性的特点。通常,高


级代码不需要了解顶点缓存是如何实现和执行的。
       和其他缓存机制类似,顶点缓存基于最近使用的数据未来仍将被使用的原则。图形处理器缓存一小部分(如,16个)最近使用的顶点


,当API要发送顶点时,首先探测缓存内是否已存在。当然,这要求API了解图形卡缓存的大小和替换机制。若缓存内没有该顶点,则发生脱


靶,API发送顶点,并更新缓存;若缓存内有该顶点,就命中,API通知图形卡“使用缓存内位置x的顶点”。


      如前所述,顶点缓存其实是一种底层的优化手段。任何三角网都可用高级代码实现正确渲染而不用考虑缓存。但进行顶点顺序的调整


,使共享顶点的三角形几种发送有助于提高效率。这种调整只需要进行一次,并且可以离线进行。它只会对性能有帮助,不会使没有缓存的


系统性能降低。


      善用缓存,可能使发送到显卡的顶点数降低到平均每个三角形少于一个。


三角带
三角带是一个三角形列表,其中每个三角形都于前一个三角形共享一边。
最佳情况下,三角带可用n+2个顶点储存n个面。n很大时,每个三角形平均发送一个顶点。


遗憾的是,这只是最佳情况。实践中,很多网格是一个三角带无法表达的;不仅如此,三个以上三角形共享的顶点还是要多次发送给图形卡


。从另一方面说,每个三角形至少要发送一个顶点。但在顶点缓存机制下,有可能将每个三角形发送的顶点数降到一个以下。当然,顶点缓


存需要额外的簿记信息(索引和缓存管理数据)。可使尽量这些额外信息对单个顶点来讲相对较大,操作速度也会相对下降,但发送顶点数


最少的系统在特定平台上速度最快


       三角扇和三角带类似,但不如三角带灵活,所以很少使用。
三角扇使用n+2个顶点储存n个面,和三角带相同。但是,第一个顶点必须为所有三角形共享,所以实践中不太经常能找到大型三角扇应用的


场合。并且,三角扇不能象三角带那样连接。所以,三角带只能在特殊场合应用,对一般应用来说,三角带更灵活。


纹理映射坐标
       纹理映射是将位图(称作“纹理图”或简称“纹理”)贴到多边形表面的过程。
       我们希望将2D纹理贴到多边形表面上,同时考虑多边形表面上,同时考虑多边形在摄像机空间的方向。对多边形中每个需要渲染的像


素都要计算2D纹理映射坐标,这些坐标用以索引纹理图,从而为相应像素着色。
       通常,在顶点保存纹理映射坐标,三角形面中其余各点的坐标通过插值进行计算。


表面法向量
许多应用程序中,网格上的各点都需要一个表面法向量。它可以用来:
计算光照
进行背面剔除
模拟粒子在表面“弹跳”的效果
通过只考虑正面而加速碰撞检测
表面法向量可能保存于三角形级或顶点级,或两者皆有。


     通过平均三角形法向量求得顶点法向量是一种经验性方法,大多数情况下都能工作得很好。但是有必要指出,某些情况下,其结果并不


是所期望的。


     最明显的例子是两个法向量刚好相反的三角形共享一个顶点。这种情形常发生在“公告板”物体上,“公告板”由两个三角形背靠背构


成。它的两个法向量方向恰好相反,其平均值为零不能标准化。为解决这种问题,必须拆开所谓的“双面”三角形。


     平均顶点法向量的另一个问题会在应用Gouraud着色时发生,对该着色器一个简化解释:光照是按顶点法向量逐点计算的。如果使用平


均三角形法向量计算的顶点法向量,某些应该有尖锐边缘的地方会显得“过于平滑”。以最简单的盒子为例,边缘处应该有一个剧烈的光照


变化。如果我们使用平均
顶点法向量,这个剧烈变化会消失。


       根本问题在于盒子边缘不连续,而这种不连续却不能很好的被表达,因为每个顶点只有一个法向量。其实仍然可以使用面拆分解决问


题;换句话说,重复不连续处的顶点。这样做之后,人为的构造了一个不连续以防止顶点法向量被平均。这种“裂缝”在网络拓扑中可能会


导致问题;但在如渲染、光线追踪等任务中没有问题。


光照值
       另一种常由顶点维护的信息是光照值。这些光照值用于沿表面的插值,典型的方法如Gouraud着色(顶点着色器或插值)。
       有些时候,顶点处仅保存法向量,渲染时动态计算光照值
0 0
原创粉丝点击