|
基于LOD的大规模真实感室外场景实时渲染技术的初步研究 part II&III(4) 第五章:裁剪 通常,3D API都会提供内置的裁剪系统,但是这些裁剪系统都是在经过视图、投影变换以后的。即裁剪是投影空间中进行的。因此我们需要建立一种方法,在顶点进行矩阵变换之前就进行裁剪,同时我们的裁剪系统还必须要有能力裁剪一个四叉树的节点。 在投影过程中,有一个投影体,只有当物体处于这个投影体中的时候,我们才能看到这个物体,否则物体将被裁剪掉。因此这个投影体也通常被称为视见体(View Frustum)。在进行正交投影的时候,投影体为一个长方体,在进行透视投影的时候,投影体则为一个平头锥体。下面我们以平头锥体为例子来导出我们的裁剪系统。 如图5.1,一个投影体由六个面组成,一个平面的方程可以表示为 。我们规定朝投影体内部的方向为平面的正方向,判断一个顶点是否在投影体内部时,我们只要把顶点坐标代入到六个面的方程中,通过检查结果的符号就可以判断点是不是在投影体内部(所有的符号都为正)。下面我们推导世界空间中的投影体的六个面的方程。 图5.1投影体,左图为世界空间中的投影体。右图为经过投影变换后的投影体。 图5.2变换后的投影范体的尺寸。 世界空间的投影体在经过投影变换后,会成为一个范体,如图5.1右图所示。这个范体的尺寸见图5.2。我们很容易得到这个范体的六个面的方程,它们是 。 我们假设这六个平面中某个平面上有一个点(x0,y0,z0,1),在进行投影变换之前的坐标为( )。 这个平面的方程为 。 投影变换前,在世界空间中的方程为 。 则点必须满足 和 。 如果变换矩阵为T。则 。 结合这三个等式,我们立即就可以得到 。 结合投影空间中范体的六个面的方程,我们现在可以很容易的得到世界空间中的投影体的六个面的方程。 我们已经有了裁剪体的方程,当我们需要裁剪一个顶点的时候,这六个方程已经足够了。但是我们要判断一个区域的可见性时,我们进行一些额外的计算。如图5.3所示,一个物体和投影体的关系大致可以分为:包围、被包围、相交和相离四种情况。图中最大的浅蓝色的矩形包围了整个投影体。深绿色的小矩形则完全被投影体包围。浅绿色的矩形和投影体相交。这三种情况下物体都是可以被看到的。剩下红色的矩形则和投影体相离、只有它完全不可见。 图5.3物体和投影体的关系。 当处理节点的可见性的时候,由于节点的不规则性。我们还需要引入包围体的概念。所谓的包围体,就是用一个比较简单的几何体去度量另外一个比较复杂的几何体,让它刚好能包围另外一个几何体。比较合适的包围体外形有矩形、正方形和球体。其中球体处理最为简单,但是近似度也最差。我们为每一个节点都建立一个包围体,只要测试这个包围体,我们就可以决定一个节点的可见性,由于包围体肯定大于这个节点,因此我们可以保证不会有任何可见的节点被裁剪在投影体之外。 第六章:性能测试 1. 内存消耗量:本文的LOD算法的内存消耗量只和地形的大小有关,而且这种关系是线性的。对于地形中的每一个顶点,我们需要的信息如下:高度信息(1字节),粗糙度信息(浮点型,4字节)。四叉树信息(1字节)。因此每个顶点需要6个字节来保存。对于一个4097×4097的地图,我们需要96M的存储空间,这在连PC机的RAM大小都几乎要以GB来计算的今天,应该不是很大的问题。同时考虑到本文采用的都是静态的数据结构,在内存消耗方面应该还存在着很多的优化余地。 2. 速度和图像质量:本文的算法既没有在进行恒定的速度控制,也没有进行恒定三角形数量的控制。生成三角形的数量除了和C,C2的大小有关以外,还和地形本身的起伏程度有关。本文的演示程序在一般情况下,C=3,C2=30左右就能达到比较好的效果。当C=4.5时候,就基本不存在几何形变的问题。而且FPS均在120以上(使用了细节纹理),速度完全达到要求。 3. 实例测试:我选择的测试地图大小为2049×2049和4097×4097。地图使用Photoshop的分层云彩功能制作,用本文演示程序的地图工具进行修改加工。纹理为区域地貌纹理加亮度图调制混合得到。细节纹理被关闭(即只进行了一遍纹理映射)。测试平台为Intel赛扬II 1.2G,nVidia GForce 2/MX400,128M RAM。操作系统为Windows 2000sp2。显卡驱动版本为4345官方发布版。注意驱动程序必须安装正确,Windows2000提供的驱动并不能很好的支持OpenGL。 表6.1:2049×2049地图的渲染结果。
|