延迟渲染:高效光照计算的秘密

延迟渲染与传统多Pass渲染的核心区别在于处理几何与光照的方式。传统方法需为每个光源重复绘制全部几何(如1000个物体×10光源=10000次绘制),效率低下。延迟渲染则分两步:

几何Pass:仅一次绘制,将物体颜色、法线等基础信息存入G-buffer(几何缓冲区);

光照Pass:基于G-buffer统一计算所有光源效果,避免重复几何绘制。

优势在于光源增加仅影响光照计算(屏幕空间操作),几何绘制次数不变,尤其适合多光源场景。延迟渲染通过解耦几何与光照,显著提升性能。


延迟渲染的生动比喻:画画和上色

想象你是一个画家,要画一幅复杂的风景画,里面有很多物体(树、房子、人物),还有很多光源(太阳、灯光、火把等)。

传统多Pass渲染(Forward Rendering)就像这样:

你先画好树的轮廓和颜色,然后给它加上太阳光的阴影和高光。

接着你要给树加上灯光的光照效果,你得把树重新画一遍,再加上灯光的光照。

然后再给树加上火把的光照效果,又得重新画一遍树。

对场景中每个物体都这样重复,光源越多,画的次数越多,累不累?

延迟渲染(Deferred Rendering)则是:

第一步:先把所有物体的“基础信息”画在一张“信息图”上,比如:
颜色(漫反射颜色)
法线(表面朝向)
深度(距离摄像机的远近)
材质属性(粗糙度、金属度等)

这一步你只画一次,不管有多少光源。

第二步:根据这张“信息图”,统一计算所有光源对场景的光照,就像你拿着这张信息图,给它涂上不同光源的光影效果。


具体点说:

G-buffer(几何缓冲区):就是那张“信息图”,里面存储了场景中每个像素的基础数据。

光照Pass:用G-buffer里的数据,计算每个光源对每个像素的光照贡献,然后叠加起来。


为什么延迟渲染效率高?

你只画一次几何(物体形状和材质信息),不管光源多少。

光照计算是在屏幕空间(像素级别)进行的,不需要重新绘制物体。

光源越多,增加的是光照计算的次数,而不是重新绘制物体的次数。


举个简单的数字例子

假设场景有1000个物体,10个光源:

传统多Pass:每个光源都要绘制1000个物体,绘制次数 = 1000 × 10 = 10000次。

延迟渲染:绘制物体只做一次(1000次),光照计算做10次,但光照计算是在屏幕像素上,不是重新绘制物体,效率更高。


总结

传统多Pass渲染 延迟渲染(Deferred Rendering)
每个光源都要重新绘制场景几何 场景几何只绘制一次,先存储基础信息
光照计算和几何绘制耦合 光照计算和几何绘制分开,光照在屏幕空间统一计算
光源多时性能下降明显 光源多时性能下降较缓,适合多光源场景



版权声明:本文为CSDN博主「你一身傲骨怎能输」的原创文章,
遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33060405/article/details/145292219

最新文章