游戏中的光影效果

好久没有更新过博克了,春节的最后一天更新一下,写一下关于游戏中关于光影效果的方法,以及我的实现.

去年有个机会和call duty3的程序总监聊天(此人是一个华人,当时已经回国在腾讯做互动娱乐部门副总,想找我过去),他提到次时代游戏和前一代游戏的最大区别之一就是游戏的光影效果,可见游戏中光影效果是如此的重要。

关于游戏中的光照,就目前来看大致两种方式,一种是Unreal的与渲染光照贴图+ShadowMap,另一种则是Crysis的完全实时光影。效果上都不错,下面来简单分析一下。

在讨论之前先要明确一点,游戏中的光影真的要追求和现实中一样的物理机理么?答案是否定的。画面是一个视觉艺术,只要看上去真是,亮丽就可以了,至于现实中是不是真的是这样再次,只要大的光影与现实中一致就行,细节和实现方法可以不遵循真实的物理原理。

先说一下Unreal3的光影方案。总的来说就是直接光照生成光照贴图再加上运行时运动物体的ShadowMap,通过对其编辑器的使用并没有发现很明显的全局光照的影子。反而是使用了大量的光源来模拟全局光照。对于模型可以选择是使用顶点色还是光照贴图。从实际效果上看,其实使用直接光照,通过手动放置更多的光源是可以达到很不错的光影效果。这样做的问题并不在效果上,而是不能做到实时的所见即所得,必须要通过编译光照得到结果,光照贴图只能针对静态物体,同时从引擎设计上来看在编辑器模式和游戏模式中可能会涉及到不同的光照方案,毕竟只有编译后的结果才是游戏中真正的运行的结果。

Crysis的光照方案强调的是所见即所玩,而且是实时的。在Crysis1的光照方案就是直接光照+ShadowMap+SSAO。很明显没什么需要编译的,因此可以做到所见即所玩而且是实时的。在Crysis2的光照方案中考虑了全局光照的因素。简单来说就是建立在这样一个假设上:全局光照可以通过放置若干点光源直接光照来模拟出来(其实很多游戏编辑器中摆放大量点光源也是这个目的)。因此Crysis2的全局光照是通过算法来自动将光源进行场景点光源的分布,进而模拟全局光照。

从Unreal,Crysis的光照方案看,总的来说就是直接光照,通过(手动或者自动)放置更多光源来进行全局光照的模拟(生成光照图或者实时计算),同时运动物体使用ShadowMap。

我们先抛开物理上光能传递等机理。直接光照中,物体只接受来自光源的光照,被遮挡的地方完全不受光,而现实世界中物体物体之间好要进行间接光照,这就形成了全局光照。而这间接光照如果不想费事去实现什么复杂算法,完全可以在编辑器中在需要有间接光照的地方手动摆放光源进行补光达到模拟间接光照的效果,其本质上仍然是直接光照。Crysis只是使用算法自动放置这些进行补光的光源而已。

另外从间接光照的原理上来看,间接光照的结果是使场景除了被遮挡的很厉害的地方以外大部分区域光照渐趋均匀的一个过程。但是这是我们想要的全部么?从画面的精美程度上来看需要有对比度,需要画面色彩上有层次感,而这些也许并不是现实世界中会有的效果。

接下来我说一下我的光照方案,最后上几张图。

首先我将光照计算分为直接光照和间接光照,并分别对应两个函数负责计算。同时外部由脚本命令进行直接光照和间接光照调用驱动。

之所以这么做的原因是,要想达到好的效果并不是单纯的直接光照或者间接光照就能做到的。简单来说就是先进行一次直接光照,在进行间接光照,然后再进行一次直接光照。之所以这么做如上面所讲间接光照的结果会使场景亮度趋于均匀,这样层次感就不明显了,那么最直接的办法就是在进行一次直接光照,但是要注意这次直接光照的强度,可能会导致有些亮的地方过饱和。这需要进行光源亮度设置等。

之所以使用脚本驱动直接光照和间接光照是因为并不一定是“直接光照-〉间接光照-〉直接光照”这个单一的模式。脚本也很简单

D I D, D I I D, D I D I I等。

其中D代表直接光照,I代表间接光照。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Leo1981816/archive/2011/02/08/6174567.aspx

你可能感兴趣的:(游戏)