- 最后登录
- 2014-10-23
- 注册时间
- 2011-7-19
- 阅读权限
- 90
- 积分
- 81303
- 纳金币
- -1
- 精华
- 11
|
基本的剔除方法
最简单的剔除方式就是把世界分成区域, 每个区域有一个其他可见区域的列表。 那样, 你只需要显示针对任何给定点的可见部分。 如何生成可见视野区域的列表是技巧所在。 再者, 有许多方法可以用来生成可见区域列表, 如 BSP 树, 窥孔等等。
可以肯定,当谈论 DOOM 或 QUAKE 时,你已经听到过使用 BSP 这个术语了。 它表示二叉空间分割。
BSP 是一种将世界分成小区域的的方法,通过组织世界的多边形,容易确定哪些区域是可见的而哪些是不可见的 – 从而方便了那些不想做太多绘制工作的基于软件的渲染器。它同时也以一种非常有效的方式让你知道你位于世界中的什么地方。
在基于窥孔的引擎 ( 最早由 3D Realms 已经取消的 Prey 项目引入游戏世界 )里,每个区域 ( 或房间) 都建造有自己的模型, 通过每个区域的门 ( 或窥孔 )能够看见另外的区段。 渲染器把每个区域作为独立的场景单独绘制。 这就是它的大致原理。 足以说这是任何一个渲染器的必需部份,而且非常重要。
尽管一些这样的技术归类在 "遮挡剔除"之下,但是他们全部都有同样的目的: 尽早消除不必要的工作。 对於一个Fps游戏(第一人称射击游戏) 来说,视野中时常有许多三角形,而且游戏玩家承担视野的控制,丢弃或者剔除不可见的三角形就是绝对必要的了。 对空间模拟来说也是这样的, 你可以看见很远很远的地方 – 剔除超过视觉范围外面的东西就非常重要。 对于视野受到限制的游戏来说 – 比如 RTS (即时战略类游戏)--通常比较容易实现。 通常渲染器的这个部份还是由软件来完成, 而不是由显卡完成, 由显卡来做这部分工作只是一个时间问题。
基本的图形管线流程
一个简单的例子,从游戏到多边形绘制的图形管线过程大致是这样:
· 游戏决定在游戏中有哪些对象, 它们的模型, 使用的纹理, 他们可能在什么动画幀,以及它们在游戏世界里的位置。 游戏也决定照相机的位置和方向。
· 游戏把这些信息传递给渲染器。以模型为例 ,渲染器首先要查看模型的大小 ,照相机的位置, 然後决定模型在屏幕上是否全部可见, 或者在观察者 (照相机视野) 的左边,在观察者的后面,或距离很远而不可见。它甚至会使用一些世界测定方式来计算出模型是否是可见的。 (参见下面这条)
· 世界可视化系统决定照相机在世界中的位置,并根据照相机视野决定世界的哪些区域 / 多边形是可见的。有许多方法可以完成这个任务, 包括把世界分割成许多区域的暴力方法,每个区域直接为"我能从区域 D 看见区域 AB & C", 到更精致的 BSP(二叉空间分割)世界。 所有通过这些剔除测试的多边形被传递给多边形渲染器进行绘制。
· 对於每一个被传递给渲染器的多边形, 渲染器依照局部数学 ( 也就是模型动画) 和世界数学(相对于照相机的位置?)对多边形进行变换,并检查决定多边形是不是背对相机 (也就是远离照相机)。背面的多边形被丢弃。 非背面的多边形由渲染器根据发现的附近灯光照亮。然后渲染器要看多边形使用的纹理,并且确定 API/ 图形卡正在使用那种纹理作为它的渲染基础。 在这里,多边形被送到渲染 API,然后再送给显卡。
很明显这有些过分简单化了,但你大概理解了。 下面的图表摘自Dave Salvator's 3D 管线一文,可以给你多一些具体细节:
3D 管线
- 高层的概观
1. 应用程序/ 场景
·场景/ 几何数据库遍历
·对象的运动,观察相机的运动和瞄准
·对象模型的动画运动
·3D 世界内容的描述
·对象的可见性检查,包括可能的遮挡剔除
·细节层次的选择 (LOD)
2. 几何
·变换 (旋转,平移, 缩放)
·从模型空间到世界空间的变换 (Direct3D)
·从世界空间到观察空间变换
·观察投影
·细节接受/ 拒绝 剔除
·背面剔除 (也可以在后面的屏幕空间中做)
光照
·透视分割 - 变换到裁剪空间
·裁剪
·变换到屏幕空间
3. 三角形生成
·背面剔除 ( 或者在光照计算之前的观察空间中完成)
·斜率/ 角度计算
·扫瞄线变换
4. 渲染 / 光栅化
·着色
·纹理
·雾
·Alpha 透明测试
·深度缓冲
·抗锯齿 (可选择的)
·显示
通常你会把所有的多边形放到一些列表内, 然後根据纹理对这个列表排序(这样你只需要对显卡传送一次纹理, 而不是每个多边形都传送一次), 等等。在过去,会把多边形按照它们到相机的距离进行排序,首先绘制那些距离相机最远的多边形, 但现在由于 Z 缓冲的出现,这种方法就不是那么重要了。 当然那些透明的多边形要除外,它们要在所有的非半透明多边形绘制之后才能够绘制 ,这样一来,所有在它们后面的多边形就能正确地在场景中显现出来。 当然,象那样,实际上你必须得从后到前地绘制那些多边形。 但时常在任何给定的 FPS 游戏场景中, 通常没有太多透明的多边形。 它可能看起来像有,但实际上与那些不透明的多边形相比,其比率是相当低的。
一旦应用程序将场景传递到 API, API 就能利用硬件加速的变换和光照处理 (T&L), 这在如今的 3D 显卡中是很平常的事情。 这里不讨论涉及到的矩阵数学(参见Dave的 3D 管线导论),几何变换允许 3D 显卡按照你的尝试,根据相机在任何时间的位置和方向,在世界的正确角度和位置绘制多边形。
对于每个点或顶点都有大量的计算, 包括裁剪运算,决定任何给定的多边形实际上是否可见,在屏幕上完全不可见或部分可见。 光照运算,计算纹理色彩明亮程度,这取决于世界的灯光从什么角度如何投射到顶点上。 过去,处理器处理这些计算,但现在,当代图形硬件就能为你做这些事情, 这意谓着你的处理器可以去做其他的事情了。很明显这是件好事情 (tm) ,由于不能指望市面上所有的 3D 显卡板上都有T & L, 所以无论如何你自己将必须写所有的这些例程 (再一次从游戏开发者角度来说)。 你将在本文各处的不同段落看到 "好事情 ( tm)" 这个词汇。 我认为,这些特征为使游戏看起来更好作出了非常有用的贡献。 毫不令人吃惊,你也将会看见它的对立面;你猜到了,那就是“坏事情 (tm)”。 我正在尝试争取这些词汇的版权, 你要使用他们就得支付一笔小小的费用哟。
曲面片(高次表面)
除了三角形,曲面片的使用现在正变得更普遍。 因为他们能用数学表达式来描述几何 ( 通常涉及某种曲线的几何形体) ,而不仅仅只是列出大量的多边形以及在游戏世界中的位置, 所以曲面片 ( 高次表面的另一个名称) 非常好。 这样,你实际上就能够动态地根据方程式来建立( 和变形 )多边形网格, 并决定你实际想要从曲面片上看到的多边形数量。 因此,举例来说,你可以描述一个管道, 然后在世界中就可以有这种管道的许多样例。 在一些房间中, 你已经显示了 10,000个多边形,你可以说,"因为我们已经显示了大量的多边形,而且任何更多的多边形将会使幀速率下降, 所以这个管道应该只有 100 个多边形"。 但在另外一个房间中, 视野中只有 5,000个可见的多边形,你可以说,"因为我们还没有达到预算可以显示的多边形数量 , 所以,现在这个管道能有 500 个多边形"。 非常美妙的东西 --但你必须首先知道所有这些,并建立网格,这不是无足轻重的。 通过 AGP 传送同一个对象的曲面方程确实要比传送其大量顶点节省成本。 SOF2 就使用了这个方法的一种变体来建立它的地表系统。
事实上现在的 ATI 显卡具有 TruForm, 它能带一个以三角形为基础的模型,并将该模型转换为基于高次表面的模型,使其平滑 — 接着再用十倍三角形数量把模型转换回基于大量三角形的模型 (被称为retesselation)。然后模型送往管线做进一步的处理。 实际上 ATI 仅仅在 T & L 引擎之前增加了一个阶段来处理这个过程。这里的缺点是,要控制哪些模型需要被平滑处理而哪些又不需要。你常常想要一些边缘比较尖锐, 比如鼻子,但它却被不恰当的平滑过了。 这仍然是一种很好的技术,而且我能预见它在将来会被更多的应用。
这就是第一部份 -- 我们将会在第二部分继续介绍光照和纹理,下面的章节会更加深入。
|
|