一直以来,不明白多光源动态阴影应该如何高效的实现,直到在网上查阅了大量的文章,得知虚幻3引擎里用到了 Deferred Lighting (延迟光照)渲染系统,实现了多光源的动态光照和阴影,我猜其它游戏中的实现方法也一定是大同小异了。
于是我花了两个星期研究,有了现在的结果。延迟光照来源于一种基本的思想,三维变二维的处理方式,不过它变的很完整,除了把整个视口的颜色信息画到纹理,还把几何数据(坐标,法线)也分别画到了纹理上,使每个像素都有了完整的顶点信息。这一组纹理被称作“G-Buffer”,我一直觉得不知道怎样翻译比较好,“几何纹理缓存”?总之每帧的渲染中几何模型只画了一次,剩下的都是图像处理了,每加一个光照,就用G-Buffer的信息处理一次光照效果,累加到最终的输出。如果有一盏以上的灯光,最终场景的颜色亮度会超过1.0,所以必须用浮点纹理,也必须进行后期HDR效果处理,整个渲染过程变的十分完美。在这些步骤中,控制各种特效的开和关变的很容易,我觉得这是一大好处,虽然它本身的实现过程很麻烦。
在具体的实现中,要解决的问题还是很多的,主要是画半透明物体的问题。网上很多文章都是大概雷同的解释,就是对半透明物体依然使用传统的方法绘制,单独走一个管线。我觉得这是个最差的设计。画出那么多G-Buffer就是为了方便进行各种后期效果处理的,加上必须要做HDR处理,已经消耗很多时间了,中间要做一次传统方法的绘制岂不是严重效率低下?而且效果是要统一的,所有的材质效果,光照效果,阴影效果,无论是否半透明都要在两套渲染过程中做的一模一样,实在不是一件容易的事。于是我想了一个把半透明物体
Deferred Lighting (延迟光照) + Light Pre-Pass 实现多光源动态阴影
最新推荐文章于 2023-08-24 20:41:55 发布