游戏引擎之:可视性判断

原创 2004年11月02日 14:23:00

可视性判断是指:能够根据给定的相机位置与方向,快速地计算出一个场景中有那些内容是可见的,并对场景中的可见部分进行渲染处理。可视性判断主要进行以下几种类型的判断:
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

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



[前端]判定元素是否在可视范围的方法总结

1 最基本的方法,js 方式document.getElementById.scrollIntoViewIfNeeded 如果是true 则调用基本的document.getElementById.s...
  • jsh0123
  • jsh0123
  • 2016年04月07日 10:33
  • 1247

cocos2d-x游戏引擎核心之三——主循环和定时器

cocos2d-x游戏引擎核心之三——主循环和定时器 2014-10-28 11:40 by 小天_y, 107 阅读, 0 评论, 收藏,  编辑 一、游戏主循环 在介绍游戏基本概念的...
  • u012419410
  • u012419410
  • 2016年02月02日 15:04
  • 399

cocos2d-x游戏引擎基础知识介绍(一)

cocos2d-x基础概念 cocos2d-x是一个跨平台的游戏引擎。游戏引擎是由一些提供常见的功能的软件组成。你可能通常把它称为API或者框架,但是在本教程中,我们称之为游戏引擎。游戏引擎包含很多...
  • Letme_Carry_you
  • Letme_Carry_you
  • 2017年07月27日 10:34
  • 342

Java多线程—原子性与可视性

一、定义  1 原子性       原子是发生化学反应的最小单位,顾名思义即为不可再拆分。原子操作是不能被线程中断机制中断的操作,一旦操作开始,则它一定在可能的切换到其他线程之前执行完毕。简而言之就是...
  • gds2014
  • gds2014
  • 2015年12月15日 16:20
  • 1081

UE3 预计算可见性

文档变更记录:由 Daniel Wright 创建。 预计算可见性 概述将游戏设置为使用预计算可见性将关卡设置为使用预计算可见性单元格放置可视化结果可见性设置相关统计数据结...
  • pizi0475
  • pizi0475
  • 2015年10月14日 16:58
  • 887

ArcGIS教程:山地风景区景观规划中的可视性分析

对景观视觉效果的控制和塑造是景观规划设计的核心内容之一。可视性分析可以将景观的感官认知转化为可量化的指标,成为服务于景观规划设计的一种科学的、有效的决策手段。可视性分析结果可以作为景观开发和景观空间布...
  • u010687924
  • u010687924
  • 2014年11月05日 15:58
  • 2466

java 并发操作之原子性与可视性

原子性 原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a ...
  • u010359884
  • u010359884
  • 2015年06月25日 15:38
  • 688

《游戏引擎架构》 笔记(一)

博客搬家自http://zhouyuanchao.com/wordpress/archives/41 游戏团队:工程师、艺术家、游戏设计师、制作人 平台游戏(platformer)...
  • yjwx0018
  • yjwx0018
  • 2016年08月26日 00:05
  • 2537

最常见的开源游戏引擎

开源即开放源代码(Open Source),游戏引擎好比赛车的引擎,是用于控制所有游戏功能的主程序,从计算碰撞、物理加速系统和物体的相对位置,到接受玩家的输入,以及按照正确的音量输出声音等等。无论是角...
  • zxxSsdsd
  • zxxSsdsd
  • 2015年05月11日 15:24
  • 3152

android之控件的可视性

所有的Android控件都具有一个可见属性,可以通过android:visibility进行指定。 android:visibility 可选值有3种:visible、invisible、gone...
  • strong90
  • strong90
  • 2017年08月28日 10:00
  • 42
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:游戏引擎之:可视性判断
举报原因:
原因补充:

(最多只允许输入30个字)