虚幻3引擎简介--阴影

1649 篇文章 11 订阅
1623 篇文章 22 订阅

 虚幻3引擎不仅在模型上有着出色的特性,其阴影效果也是非常优秀的。

点击放大此图片

  虚幻3引擎完全支持现在流行的3中阴影模式:Shadow Mapping, Projected planar, Shadow Volume。而其中Shadow Mapping和Shadow Volume都是现在比较常用的阴影算法。

点击放大此图片

  Shadow Mapping是一种基于阴影映射图的阴影生成方法。其原理是先以光源为视点对场景进行渲染,得到一副所有可渲染物体相对于光源的Shadow Map(也叫depth map),在这幅Shadow Map中所有的像素值的灰度(Shadow Map图本身的像素只有灰度值,也就是说他是一幅黑白图)不代表颜色,而是代表他相对于光源的距离。然后在以原来的视点渲染整个场景并计算每个像素到光源的距离,通过将这个距离与刚才得到的Shadow Map中记录的距离相比对,从而得出这个物体是不是在阴影中的结果,然后根据结果采用不同的光照渲染。这种方法比较容易理解但是其缺点就是在有动态光源出现的场景中效率非常低下,因为每次光源移动都需要重新计算新的Shadow Map,而只要光源不发生位移,那么以前生成的Shadow Map就可以重复使用。所以这种技术通常用于静态光源比较多的场景中。而且这种方法除了处理移动光源时效率低下之外,其另外一个重大的缺陷就是其阴影的锯齿问题。其主要原因是,在很多情况下以光源为视点所生成的Shadow Map包含太多物体而且这张Shadow Map的分辨率不够,所以造成每个物体的阴影边缘会产生很多锯齿。要解决这种问题,有两个方法可供选择,一是增大Shadow Map的分辨率,二是采用更精确的以光源为视点的生成Shadow Map的方法;由于Shadow Mapping算法的本身将消耗大量的计算资源,所以第一种方法显然在效率上是不可取的。人们开发了新的以光源为视点的算法,用以生成更精确的Shadow Map。其方法是设法在不降低分辨率和造成阴影失真的情况下设法拉近光源视点相对阴影物件的距离。其效果我们可以在下图中看到。

  左上图是以光源为视点用透视法生成的Shadow Map.右上图是以左上图为基础生成的最终渲染结果(我们可以看到阴影满是狗牙,非常难看)。

  左下图是用改进的透视方法生成Shadow Map(同样是以光源为视点)。右下图是以左下图为基础生成的最终渲染效果(阴影相对上面好了很多)。

  虽然下面的效果相对于老式的Shadow Mapping算法可以生成更精确的阴影轮廓,但是我们知道,由于光的波粒二项性阴影的边界在实际情况中是虚的而不是实的。这个问题在现阶段还无法通过各种算法来一步实现,所以为了得到真实的柔化阴影,虚幻引擎采用了对阴影的边界进行超级16X采样的算法,这是现阶段人们能够采用的唯一手段来得到柔化阴影。而具体的效率就要看各家的显卡的效率了。而就虚幻3图像引擎本身而言,支持这样的"16X采样"本身就是一个非常大的进步。

  Shadow Volume同样是一种阴影映射图的阴影生成方法。但是在渲染动态光源的效率方面他有着先天的优势。其原理是先从光源向可渲染的每一个边缘引一条直线,从而在场景中形成一个个的阴影锥。然后在从视点向要被渲染的物体引一条直线,通过计算这条直线穿过阴影锥边缘的次数而得到被渲染物体是否在阴影之内的结果。这种方法由于不需要生成Shadow Map所以在处理动态光源的时候其开销相比Shadow Mapping要小的多。

  具体方法是对从视点到物体引一条直线,并对这条直线进行赋Stencil值,当直线进入一个阴影锥时Stencil值就加一,当直线从一个阴影锥中出来时Stencil值就减一。那么如果这条直线最后的值为0那么说明物体不在阴影中。

  当Stencil值不为一时,那么就可以断定这个物体在阴影之中。

  但是这种算法存在一个致命的缺陷,那就是当视点位于阴影锥当中的时候就会产生不正确的渲染。如上图所示,物体在阴影中但是其Stencil却为零。

  于是id的Carmark对这种算法进行了改进。将视点到像素的直线延长,看看其是否与阴影锥产生进出的关系,并将这种进出的关系同样华为Stencil值的加减,从而得出正确的阴影渲染结果。

  这种方法的好处是在处理动态光源时,其效率比传统的Shadow Mapping方法效率高很多,而且由于这种方法的精度相对于Shadow Mapping很高(因为不涉及到从光源视点生成的Shadow Map),所以也就不会产生恼人的锯齿问题。在虚幻3引擎中,这种阴影生成方法同样支持通过16X超级采样来生成柔和的软阴影。

  虚幻3引擎支持的第三种阴影生成方法是Projected planar,是一种基于模板缓冲的阴影投射技术。这种技术相对前两种技术可以说是小弟弟了,1988年才由Blinn提出其原始算法。这是一种通过将三维物体通过数学算法得到他在平面上的投射图来生成阴影的方法。

点击放大此图片

  其数学算法是这样的:       M*v=P

  我们可以通过上面的图来了解一下Projected planar阴影的生成过程。左上图是没有阴影的正常视点渲染结果。右上图是以光源为视点的没有阴影的渲染结果。中左是以光源为视点的shadow map (depth map)。而中右是将前面的shadow map (depth map)中的物体投射(投影)放在以正常视点为基础的平面上。左下是正常视点的shadow map (depth map)。右下图是经过最后处理(通过对比前面的第四和第五张图)的带有阴影的渲染结果。但是在计算机处理的正常过程中是没有第一步和第二步的。

  通过上面的过程解释我们可以知道,这种方法实现起来相比前两种方法来说并不简单。但是这种阴影生成方法有一个的天独厚的优势,那就是Projected planar可以进行离线处理。也就是说计算机可以预先将各种物体的阴影投射计算好,然后再贴到阴影物体的下面,这样就可以把游戏进行时宝贵的时间和处理资源让给其他的操作。同样,虚幻3引擎也支持对这种阴影生成方法进行16X超级采样,用来实现软阴影。

  虚幻3由于支持3种阴影技术并可以将他们结合起来应用所以可以在不同的场景中调用不同的阴影处理方法,可以在很大程度上节省系统资源

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者对游戏的说明: 首先,您应当以一种批判的眼光来看待本程序。这个游戏是我制作 的第一部RPG游戏,无任何经验可谈,完全按照自己对游戏的理解进 行设计的。当我参照了《圣剑英雄2》的源码之后,才体会到专业游 戏引擎的博大精深。 该程序的内核大约有2000余行,能够处理人物的行走、对话、战斗, 等等。由于该程序的结构并不适于这种规模的程序,故不推荐您详 细研究该程序。所附地图编辑器的源程序我已经添加了详细的注释, 其程序结构也比较合理,可以作为初学VC的例子。 该程序在VC的程序向导所生成的SDI框架的基础上修改而成。它没有 使用任何关于VC底层的东西。程序的绝大部分都是在CgameView类中 制作的,只有修改窗口特征的一段代码在CMainFrm类中。其他的类 统统没有用到。另外添加的一个类是CEnemy类。 整个游戏的故事情节分成8段,分别由Para1.h ~ Para8.h八个文件 实现。由于程序仅仅能够被动的处理各种各样的消息,所以情节的 实现也只能根据系统的一些参数来判断当前应当做什么。在程序中 使用了冗长的if……else if……结构来实现这种判断。 当然,在我的记录本上,详细的记录了每个事件的判断条件。这种 笨拙的设计当然是不可取的。成都金点所作《圣剑英雄II》采用了 剧本解读的方式,这才是正统的做法。但这也需要更多的编程经验 和熟练的code功夫。 下面列举的是程序编制过程中总结出来的经验和教训。 第一,对话方式应该采用《圣剑英雄II》的剧本方式。 现在的方式把一个段落中所有的对话都混在一个文件中,然后给每 句话一个号码相对应。这样做虽然降低了引擎的难度,却导致剧情的 编写极其繁琐。 第二,运动和显示应当完全分开。 现在的程序中,运动和显示是完全同步的。即:在定时器中调用所有 敌人的运动函数,然后将主角的动画向前推一帧,接着绘制地图,调 用所有敌人的显示函数、重绘主角。这样的好处是不会掉帧,但带来 的问题是,如果要提高敌人的运动速度,那么帧数也跟着上去了。所 以当DEMO版反馈说速度太慢的时候,我修改起来非常困难。而这个问 题到最后也仅仅是将4步一格该成了2步一格。 第,VC中数组存在上限。如果用“int aaa[1000000000]”定义一个 数组,编译器肯定不会给分配那么大的内存空间。而在这个程序中, 地图矩阵、NPC矩阵都超过了VC中数组的上限。但这一点知道的太晚了。 在1.0版本中已经发现地图最右端缺少了几行,但不知道是什么原因 造成的。(地图编辑器中未出现此问题,因为地图编辑器是用“序列 化”的方式存盘读盘的。)解决这个问题的方法是用“new”来分配 内存空间。 第四,由于不知道应该如何使用“new”和“delete”,几乎所有的DC 都使用了全局变量。这是完全没有必要的。程序运行期大约会耗用20 多M的内存空间,相当于一个大型游戏所使用的内存空间了。 另外,在游戏的剧情、美工方面也有许多问题,总之一个词“业余”。 我就不总结了。下一部作品,我将争取在程序上有一个质的飞跃。
虚幻3自学教程,图文虚幻3引擎(Unreal Engine 3)又称虚幻引擎3,是一套为DirectX 9/10 PC、Xbox 360、PlayStation 3平台准备的完整的游戏开发构架,提供大量的核心技术阵列,内容编辑工具,支持高端开发团队的基础项目建设。   虚幻3引擎的所有编写观念都是为了更加容易的内容制作和编程的开发,为了让所有的美术开发人员能够牵扯到最少程序开发内容的情况下使用抽象程序助手来自由创建虚拟环境,以及提供程序编写者高效率的模块和可扩展的开发构架用来创建,测试,和完成各种类型的游戏制作。  虚幻3引擎给人留下最深印象的就是其极端细腻的人物和物品模型。通常游戏的人物模型由几百至几千个多边形组成,并在模型上直接进行贴图和渲染等工作从而得到最终的画面。而虚幻3引擎的进步之处就在于在游戏的制作阶段,引擎可以支持制作人员创建一个数百万多边形组成的超精细模型(最上面的模型由200万多边形组成,而下面的模型仅有5287个多边形),并对模型进行细致的渲染,从而得到一张高品质的法线贴图,这张法线贴图中记录了高精度模型的所有光照信息和通道信息。在游戏最终运行的时候,游戏会自动将这张带有全部渲染信息的法线贴图应用到一个低多边形数量(通常在5000-15000多边形)的模型上。这样的效果就是游戏的模型虽然多边形数量比较少但是其渲染精度几乎和数百万多边形的模型一样,这样可以在保证效果的同时在最大程度上节省显卡的计算资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值