渲染器(Renderer):
渲染器是3D引擎的核心部分,它完成将3D物体绘制到屏幕上的任务。根据3D硬件使用方法的不同,可以分为DirectX和OpenGL两种渲染器。OpenGL渲染器通过OpenGL图形库来使用3D硬件,多数3D卡支持这种方法。而DirectX渲染器使用微软的DirectX库——归并到Windows操作系统中。在老的3D卡上面,OpenGL一般绘制速度较快一些,而在现代的3D卡上面,DirectX表现则更加出色。现在的OpenGL版本只有一个,而DirectX版本有很多:
DX6 | 基本的3D支持,没有硬件T&L,整合于Windows95中 |
DX7 | 与DX6相似,但具有硬件T&L,整合于Windows98中 |
DX8 | 有了重大改进,支持着色器,整合于Windows2000、ME、XP中 |
DX9 | 和DX8类似,具有类C的着色器语言,整合于WindowsXP SP2中
|
顶点变换和光照(T&L):
在一个物体被绘制到屏幕之前,必须先计算它的光照,并且将它从3D世界转换到屏幕二维坐标系中(这两个过程称为光照和顶点变换,也就是T&L,Transformation & Lighting)。渲染器可以使用自己的算法(软件T&L),也可以使用3D硬件(硬件T&L,OpenGL和DirectX7或以上版本)来完成这个任务。
剔除(culling)系统:
剔除系统可以只绘制出游戏场景中未被墙及其他物体遮挡的部分。一般的剔除系统是基于BSP树或者入口(Portal)的。BSP树系统是最快和最有效的场景组织结构,特别是对于室内场景来说,但是BSP树必须在场景编辑器中预计算。渲染器不支持使用八叉树(Octree)来组织场景的剔除。多数商业化3D引擎使用基于BSP树的剔除系统。如果使用BSP树的剔除系统的话,室内渲染速度和场景大小、对象数目无关,甚至在老的PC上都可以使游戏以正常的帧率运行。
二叉空间分割(BSP):
BSP树就是用来对N维空间中的元素进行排序和查找的二叉树。BSP树表示整个空间,BSP树中的任意一个接点表示一个凸的子空间。每个接点包含一个“超平面”,将这个接点表示的空间分割成两个子空间。每个接点除了保存其两个子接点的引用以外,还可以保存一个或多个元素。对于N维空间,超平面为N-1维的对象。通常,用BSP树来表示二维或者三维空间,这时,空间中的元素分别指的是线段和多边型。因其强大的排序和分类功能,BSP树有着非常广泛的应用。从隐藏面剔除、光线追踪到实体建模和机器人动作规划,都能看到BSP树的身影。
举例
认识BSP树,可以从二维空间的简单例子开始。为了简化问题,我们假定空间中的线段都是与X或者Y轴平行的,并且每次我们把空间分割成相等的两部分。比如,一个处于XY平面的正方形,第一次分割,在X方向将其分割成相等的两部分,以后的分割,按X->Y->X…的顺序进行。除非进行人为的干预,此过程将递归地进行下去。下图描述了次过程和与之对应的BSP树。
将BSP树用于视景体剔除
基本原理是:给定观察方向,如果从视点看不到前面(或后面)的某个分割面,则不但可以剔除该分割面,还可以剔除它后面(或前面)的整个子树。
执行BSP视景体剔除前,插入渲染列表的多边形数为278。
执行BSP视景体剔除后,插入渲染列表的多边形数仅为150,比BSP背面剔除更有效。
Portal(窥孔)系统:
可以快速有效的从可见集中剔除大片的空间。它的思想非常简单-把整个世界空间分解成离散的区域(Zone),区域之间以Portal连接。
Potal以一个多边形来表示,通过它,与Potal关联的两个区域可以看到彼此。Portal系统的优势在于,空间中不能通过一系列Potal看到的部分不会被渲染。当判断世界中哪些部分是可见的,Portal系统可以让我们只处理整个数据集的一小部分,在无形的Portal的背面的那些几何体都被忽略了。
通过Portal系统进行可见性测试。
1。我们把视点定位到某个区域中,这个区域永远是可见的。
2。我们逐个检测这个区域边缘的Portal,对于每一个与视域相交的Portal,我们认为与之相连接的另一个区域是可见的。
3。对于对于步骤2中得到的每个可见区域,检测其中的每个Portal(跳过与视域区域联系的Portal),但是这次使用的视域是被Portal的边界缩减了的。
4。递归上述过程,直到没有可见的Portal被发现。
LOD 系统:
可以增加室外场景的帧率,如果摄像机离物体比较远,可以自动将物体转换为“简单”形体,这样就减少啦每帧要绘制的多边形数目。
阴影贴图(Shadow Mapping):
也叫做光照贴图(Light Mapping)——这是一种可以在不减少帧率的情况下达到真实感光照和阴影效果的方法。阴影贴图编辑器允许在场景中放置任意数目的静态光源,它会为每个面预计算光流量(light flow)和静态阴影。现代商业3D游戏中多数都会使用到阴影贴图。
如下图所示,平滑的光照和阴影极大地提升了游戏的氛围。
具有阴影贴图的场景 不具有阴影贴图的场景