CSDN博客

img houdy

游戏引擎之:可视性判断

发表于2004/11/2 14:23:00  2100人阅读

分类: 计算机图形学

可视性判断是指:能够根据给定的相机位置与方向,快速地计算出一个场景中有那些内容是可见的,并对场景中的可见部分进行渲染处理。可视性判断主要进行以下几种类型的判断:
1. 判断三角形面的正面和背面。三角形面的正面和背景由手向性决定的:
左手坐标系:三角形面的三个顶点按顺时针排列时,法向量所指的方向时正面,和法向量相反的方向时背面。
右手坐标系:三角形面的三个顶点按逆时针排列时,法向量所指的方向时正面,和法向量相反的方向时背面。
判断三角形面的正面和背景的算法叫做:2D Back-Face Culling(2D背面挑选)。
2. 判断几何体中不可见的面。根据摄像机所在的位置判断一个几何体中被其他面遮挡的面。
判断几何体中不可见的面的算法叫做:3D Back-Face Culling(3D背景挑选)。
3. 判断几何体之间的遮挡情况。3D空间的几何体可以完全或者部分被其他的几何体遮挡。
4. 判断几何体是否在视截体的范围内。不在视截体范围内的几何体将会被从渲染流水线中剔除掉,不会被渲染。

有以上可以看出,可视性判断是分层来完成的。一般可以分为以下几个层次:
1. Pixel-level VSD,象素级可视性判断。此判断处在GPU阶段,GPU使用深度缓冲(depth buffer,也叫z-buffer)中的值来判断象素的遮挡情况。
2. Triangle-level VSD,三角形面级可视性判断。此判断可以处在两个不同的阶段:在GPU阶段,GPU执行2D Back-Face Culling;在CPU阶段,CPU执行3D Back-Face Culling.
3. Object-level VSD,几何体级的可视性判断。此判断处在CPU阶段,CPU判断几何体之间的遮挡情况和几何体是否在视截体内。
4. Area-level VSD,区域级的可视性判断。此判断处在CPU阶段,通过将场景中的区域表示成一些数据结构,这样一组几何体可以从可视集合中分离出来。主要的算法是空间分割,包括:四叉树,八叉树,二叉空间分割树。
5. Scene-level VSD,场景级可视性判断。此判断处在CPU阶段,判断的对象是多个场景,不可见的场景将不会被渲染。

下面分别简要讲讲不同阶段所采用的主要算法:
1. Pixel-level VSD
在这里主要的算法是z-buffer,在GPU的内部有一块叫做深度缓冲的存储区域,保存的是象素级的深度信息,和象素的颜色信息是位置一一对应的关系。当需要渲染的时候,将现存的象素的深度信息和新象素的深度信息做比较,若满足一定的条件,则新象素的颜色信息将替代原有的颜色信息,新象素的深度信息也将替代原有的深度信息。
2. Triangle-level VSD
在这里主要使用的算法是计算平面法向量和摄像机视的方向向量的点积,设平面法向量是N,摄像机视的方向向量视C,则:
     dot(N,C)>=0 可见;
     dot(N,C)< 0 不可见;
3. Object-level VSD
在这个层次,根据任务的不同,又可以分为:
  1.Frustum Culling:判断某个几何体是否在视截体内,不在视截体内的几何体将被剔除掉。
  2.Object  Culling: 判断几何体间的遮挡问题,完全被其他的几何体遮挡的几何体将会被剔除掉。
  3.Detail  Culling: 根据几何体与摄像机位置的远近,使用不同程度的细节信息来渲染几何体。
  4.Depth   Culling: 根据几何体与摄像机位置的远近,和摄像机一定距离的几何体将会被剔除掉。
4. Area-level VSD
在这里主要采用的算法是将空间分割后用一定的数据结构来描述,常见的有:四叉树,八叉树,二叉空间分割树。
4.1 八叉树
4.1.1 八叉树的构造
首先构造一个立方体,这个立方体最小包含整个场景或者场景的某个区域中的所有几何体,将此立方体作为八叉树的根(Root)。接着将该立方体盒子平均分割成八个等尺寸的小立方体,这些小立方体又被进一步分割成八个更小尺寸的立方体。该过程执行过程中产生的立方体成为八分体,每个八分体被连接到生成它的立方体盒子中,场景中的每个几何对象被连接到完全包含它的八分体中。由此构造的树中,中间结点表示的是几何体的八分体,任何空的八分体(即不包含任何几何体的八分体被剔除掉),每一个叶结点表示的是几何体。整个分割过程重复执行的次数被称为八叉树的深度,可以根据限定八叉树的最大深度或者限定立方体所能包含的几何体的最小个数来作为停止分割的标准。
4.1.2 八叉树的工作原理
通过对八叉树进行从上到下(Top-down)的遍历,只要知道树中的某个节点不可见,则它的所有子节点也不可见,从而可以被从可视集合中删除。立方体盒的可视性判断是通过对立方体盒与视平截体之间进行求交运算来完成的,即Frustum Culling。
首先判断根节点的可视性,若观察位置位于八叉树的边界内,则根节点总是可见的。
接着判断中间节点的可视性:
1)如果此立方体盒位于视平截体内,则连接到该节点的几何对象和该节点的子节点都可见。
2)如果此立方体盒与视平截体相交,则对连接到该结点的几何对象的边界体进行相应的可视性判断,然后再对该可视节点的子节点进行相同的可视性测试。
3)如果此立方体盒不可见,则所有连接到该节点的几何对象和该节点的子节点都不可见。

4.2 二叉空间分割树(BSP)
关于二叉空间分割树,我也了解的不是太清楚,正在学习中。。。。

5. Scene-level VSD
在这里主要采用的算法是门系统技术剔除掉不可视的场景。

参考文献:
1. 《3D游戏和计算机图形学中数学知识》,Eric Lengyel著
2. 《Mathematic For Game Development》,Christopher themlay著

-----------------------------致力于多媒体技术,成为有思想的软件工程师------------------------

此文章为我原创作品,若要转载,请和本人联系,或注明出处。
欢迎大家对文章内容提出宝贵意见,同时希望大家及时指出文中的错误之处,这样我可以及时更正。
我的联系方式:
QQ: 7578420
Email: jerrydong@tom.com

----------------------------------------------------------------------------------------



阅读全文
0 0

相关文章推荐

img
取 消
img