【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3128|回复: 0

[2D&3D引擎技术] 连载二:3D游戏引擎中的室外大场景渲染技术研究与实现

[复制链接]
发表于 2009-8-27 15:06:53 | 显示全部楼层 |阅读模式
3D游戏特别是网络在线游戏中,室外大场景渲染是一块非常重要的内容,它也是3D图形引擎的核心。它是图形学和图像处理理论最直接的应用,其涉及的技术还可以应用于其它领域,比如虚拟现实、3D GIS、数据可视化等,其重要性不容置疑。随着硬件的不断发展,行业对渲染场景的规模和真实感提出了更高的要求。

  第二章 3D游戏场景渲染的基础知识

  室外场景渲染从基本原理上来说可以分为两类:基于体素的渲染方法和基于多边形的渲染方法。早期的3D游戏,如三角洲特种部队就是采用的体素渲染法。体素法类似光线跟踪渲染,它从屏幕空间出发,找到地形与屏幕像素发出的射线交点,然后确定该像素的颜色。这种方法不依赖具体的图形硬件,整个渲染过程完全使用CPU处理,因此它不能使用图形卡硬件来加速,并且对于一个场景来说,往往不只是地形,还有其他使用多边形描述的物体,体素法渲染的图像很难与硬件渲染的多边形进行混合,因此这种方法现在用得极少,而多边形渲染方法则成为一种主流。选择多边形来描述和渲染地形有很多优点,最主要的是它能够很好地使用硬件加速,并且能够和其他多边形对象一起统一管理。因此本课题仅对基于这种多边形面片的场景渲染技术进行研究。

  2.1基于多边形面片的3D渲染原理

  2.1.1基于多边形面片的图形绘制流程

  用多边形面片来建立物体的三维模型有容易表示、计算简单、容易绘制几个方面的好处,因此在游戏三维图形渲染中被广泛采用(通常是三角形面片)。从模型的顶点送入渲染管道到最后形成二维图像的过程如下图2.1所示:

  2.1.2变换

  渲染管道中大部分工作是把对象模型的顶点在一个坐标系中的表示转化为另一坐标系中的表示,一般需要经过模型变换和相机变换两个过程。

  通常,几何模型被保存在自身的建模空间,即每个模型拥有单独的局部坐标系统。为了建立场景几何关系,模型将统一放置到世界坐标系中,从建模坐标系变换到世界坐标系叫模型变换。几何模型的最终成像是在摄像机坐标下,将场景物体从世界坐标系变换到摄像机坐标系叫相机变换。相机的外部参数决定了相机坐标系,因此场景在屏幕上的成像位置与形状和相机的外部参数有关。模型和相机变换采用4×4齐次矩阵表示,其形式如下:

  比如平移变换可表示如下:

  点(x,y,z)平移(tx,ty,tz)后的坐标为(x",y",z")。此外还有旋转、缩放变换,这三种基本的变换可以合成任意几何变换。

  通常把模型变换和相机变换的矩阵复合成一个矩阵处理,便于提高效率。在所有的图形绘制库中,都提供了程序接口供应用程序设置模型和相机变换对应的矩阵。其中,模型变换由场景物体的平移和旋转、缩放变换组成,相机变换则通过设置相机的位置、相机方向和向上向量来决定。

  2.1.3裁剪

  相机的参数包括投影方式、近平面、远平面、视野和屏幕的长宽比率,它们决定了物体从相机坐标系投影变换到屏幕坐标系的位置。这些参数实际上定义了一个视域四棱锥,也叫做视锥体。

  位于视锥体之外的场景部分不需要送入后续阶段处理。因此,对完全位于规一化的设备空间之外的几何元素,可简单地舍弃。而部分位于规一化的设备空间之外的几何元素则需要进行裁剪操作。由于裁剪的面就是立方体的6个表面,实现起来非常简便。应用程序也可以定义额外的平面对场景进行裁剪。视域裁剪通常由底层图形AP]自动完成。注意这里所说的裁剪是比后面章节要介绍的视锥体剔除更底层的裁剪。

2.1.4投影

  把三维物体变为二维图形表示的过程称为投影,其又分为平行投影和透视投影。透视投影是所有投影线交于投影中心;而平行投影是投影线平行,投影中心在无穷远。在游戏虚拟场景模拟中主要应用透视投影。透视投影可分为一点透视、二点透视和三点透视。

  针对一点透视投影如下图:

  从上图P点在观察平面上的投影我们可以得到描述尸点的参数方程:

  2.1.5光栅化

  从顶点组成的几何模型变换到像素的过程称为光栅化(Rasterization)。它的机理与得名来源于CRT显示器的电子枪发射方式。光栅化可分为四个子阶段,即消隐、逐像素光照明计算、纹理映射和颜色融合。

  (1)消隐

  消隐的目的是解决场景的可见性问题。所谓可见性计算,是指计算物体投射到投影平面如果有交叠,观察者应该看到哪个投影点。图形学中经典的解决方案是物体空间Z一缓冲器算法和图像空间的光线跟踪算法。由于Z-缓冲器算法易于在图形硬件中实现,逐渐演化称标准的图形硬件消隐技术。在深度缓冲器中,每个像素上始终保留最接近视点的深度。当光栅化产生新的像素后,该像素的深度和保存在深度缓冲器的像素深度进行比较,如果小于已有的像素深度,则用像素的颜色和深度替换分别保存在颜色缓冲器的像素颜色和深度缓冲器中的像素深度,反之保持不变。在绘制之前,深度缓冲器必须初始化为最远的深度,以保证可见性计算的正确性。

  (2)光照计算

  光照计算影响物体的外观。进行光照计算的几个要素包括光源位置、光源属性、光照模型、物体表面材质属性、纹理和物体表面几何属性(包括法向、微几何结构)等。最简单的光照明计算技术是在物体建模时指定每个顶点的颜色和纹理坐标,在绘制时直接利用颜色和纹理映射融合为最终颜色。这种方法称为平坦渲染(Flat shading)模式,它的速度快,但效果欠佳,是早期游戏中最常用的技术。

  真正意义上的光照计算必须指定每个光源本身的属性,包括光源的类型(点、线、面光源)、位置和光源的漫反射/镜面反射的颜色,然后根据光照模型(分局部光照明模型和全局光照明模型,前面所述直接指定顶点颜色的方法可看作最简单的局部光照明模型)在物体的每个顶点计算每个光源对该顶点的光亮度贡献,最后在光栅化层插值顶点上的颜色。这种处理模式称为Gouraud渲染模式,著名游戏guakeEi就使用了Gouraud渲染模式。

  逐顶点的光照计算对应于Gouraud渲染模式,而逐像素光照计算则对应于法向渲染模式(也称为Phong渲染模式)。Phong模式在游戏场景渲染中也被广泛采用。在游戏三维引擎设计中,必须根据图形硬件配置和场景复杂度选择合适的光照渲染模式。

  (3)纹理映射

  纹理映射是增强场景真实感的一种简单有效的技术。它将预生成的图像直接贴在物体表面,模拟物体表面外观,因此也叫贴图法。纹理映射的扩展技术有很多,包括环境映射、光照图、球面映射、立方体映射、凹凸映射、位移映射等,是图形渲染加速中最重要的手段。在真实感渲染章节会有更详细的讨论。

  (4)颜色融合

  对于每一个像素,前面步骤可能产生光照计算和纹理映射两类颜色值。不仅如此,光照明计算的结果可能来自多个光源,而每个光源可导致漫反射和镜面反射的光亮度。此外,同一像素也可能采集来自多个纹理的值,如多通道纹理映射和单通道多重纹理映射。所有这些颜色值将根据各自的不透明度融合出最终结果。颜色融合不仅能加强场景真实感,还能产生半透明绘制、景深、基于alpha缓冲器的反走样、软阴影等特效。

2.2图形绘制库OpenGL

  2.2.1 OpenGL的基本理解

  图形渲染引擎中的最底层可以自己实现,但是没有显卡硬件厂商的支持,自己实现的往往不能得到硬件加速特性。所以游戏中的图形渲染通常需要利用0penGL和DirectX等成熟图形库。现在很多游戏引擎对两个库都提供支持,作为学术研究OpenGL是更好的选择,所以本设计在实现算法时选用了OpenGL。

  OpenGL是一个封装了硬件图形加速器的软件接口口7|,几乎全部显卡对它都提够良好支持。它也是图形库的业界标准。OpenGL包括了100多个图形操作函数,开发者可以利用这些函数来构造景物模型、进行三维图形交互软件的开发。也可以说,OpenGL是一个高性能的图形软件开发包。OpenGL支持网络,在网络系统中用户可以在不同的图形终端上运行程序显示图形。OpenGL作为一个与硬件独立的图形接口,它不提供与硬件密切相关的设备操作函数,同时,它也不提供描述类似于飞机、汽车、分子形状等复杂形体的图形操作函数。用户必须从点、线、面等最基本的图形单元开始构造自己的三维模型。当然,象3DS Max那样更高一级的基于OpenGL的三维图形建模开发软件包将提供方便的建模工具。所以,OpenGL的图形操作函数十分基本和灵活。例如OpenGL中的模型绘制过程就包括网格线绘图方式、反走样网格线绘图方式、平面消隐绘图方式、光滑消隐绘图方式、加阴影和纹理的绘图方式等。总的说来,OpenGL的功能包括以下几个层面:

  (1)模型绘制

  OpenGL能够绘制点、线和多边形。应用这些基本的形体,可以构造出几乎所有的三维模型。

  (2)模型观察

  在建立了三维景物模型后,需要用OpenGL描述如何观察所建立的三维模型。

  (3)颜色模式的指定

  OpenGL应用了一些专门的函数来指定三维模型的颜色。

  (4)光照应用

  用OpenGL绘制的三维模型必须加上光照才能与客观物体更加相似。OpenGL提供了管理四种光(辐射光、环境光、镜面光和漫反射光)的方法,另外还可以指定模型表面的反射特性。

  (5)图象效果增强

  通过反走样、混合和雾化等函数来增强图象的效果。

  (6)位图和图象处理

  OpenGL还提供了专门对位图和图象进行操作的函数。

  (7)纹理映射

  OpenGL提供的一系列纹理映射函数使得开发者可以十分方便地把真实图象贴到景物的多边形上,从而可以绘制逼真的三维景观。

  (8)实时动画

  为了获得平滑的动画效果,需要先在内存中生成下一幅图象,然后把已经生成的图象从内存拷贝到屏幕上,这就是OpenGL的双缓存技术(double buffer)。OpenGL提供了双缓存技术的一系列函数。

  (9)交互技术

  OpenGL提供了方便的三维图形人机交互接口,用户可以选择修改三维景观中的物体。

2.2.2 OpenGL的工作流程

  整个OpenGL的基本工作流程如2.4图:

  其中几何顶点数据包括模型的顶点集、线集、多边形集,这些数据经过流程图的上部,包括运算器、逐个顶点操作等;图像数据包括象素集、影像集、位图集等,图像象素数据的处理方式与几何顶点数据的处理方式是不同的,但它们都经过光栅化、逐个片元(Fragment)处理直至把最后的光栅数据写入帧缓冲器。在OpenGL中的所有数据包括几何顶点数据和象素数据都可以被存储在显示列表中或者立即可以得到处理。OpenGL中,显示列表技术是一项重要的技术。

  OpenGL要求把所有的几何图形单元都用顶点来描述,这样运算器和逐个顶点计算操作都可以针对每个顶点进行计算和操作,然后进行光栅化形成图形碎片;对于象素数据,象素操作结果被存储在纹理组装用的内存中,再像几何顶点操作一样光栅化形成图形片元。

  在整个流程操作的最后,对图形片元进行一系列的逐个片元操作,最后的象素值送入帧缓冲器实现图形的显示。

  2.2.3 OpenGL的程序结构

  第一部分是初始化部分。主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。

  第二部分设置观察坐标系下的取景模式和取景框位置大小。主要利用了三个函数:函数void glViewport(1eft,top,right,bottom):设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以象素表示);函数void glOrtho(1eft,right,bottom,top,near,far):设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;函数void gluPerspective(fovy,aspect,zNear,zFar):设置投影方式为透视投影,其取景体积是一个平截头体(frustum)。

  第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换、光照处理等等。

  以下是第三部分的一个简单例程:


  2.3本章小结

  场景渲染总的来说分为基于多边形面片和基于体素两种方法。由于基于体素的方法不适应现代硬件的渲染流程,故本设计主要研究的是基于多边形面片的场景渲染。本章从图形学原理出发,讨论了基于多边形面片的3D渲染的基本流程以及其中涉及的数学模型。另外,还介绍了应用广泛的图形库OpenGL,为下面章节的具体算法讨论和软件实现做基础铺垫。

 

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-14 19:00

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表