前向渲染(Forward Rendering)和延迟渲染(Deferred Rendering)是计算机图形学中两种不同的渲染技术,具有不同的功能和性能。在开始项目时,需要决定使用哪种渲染技术,这取决于项目的需求和目标平台的限制。

前向渲染

在前向渲染中,根据灯光数量,场景中的每个物体都会被渲染一次或多次。前向渲染是一种简单直接的技术,使用起来很简单,并且可以获得非常好的效果。但是,随着场景复杂度的提升以及灯光数量的增加,前向渲染的性能将急剧下降。

延迟渲染

与前向渲染稍有不同,在延迟渲染中,光照的计算将被推迟,像素的几何信息和材质属性将被存储在 G-Buffer 中,在之后的光照计算中统一处理。延迟渲染非常适合处理大量小光源的场景,例如游戏中的火焰、爆炸、魔法等效果。然而,延迟渲染也有一些明显的缺点:

  • 额外的显存开销
  • 功耗和发热较高
  • 不支持半透明物体
  • 不支持 MSAA 抗锯齿
  • 不支持依赖深度缓冲区的功能,如景深、雾效、阴影等
  • 不适合显存有限或缺乏 API 支持的移动设备或浏览器

以上部分问题也可以通过一些额外的技术手段来解决,但是效果并不如前向渲染好,并且开发难度会更大。

总结

简单来说,前向渲染的消耗为:n × m,而延迟渲染的消耗为:n + m,其中 n 为物体数量,m 为灯光数量。

前向渲染 延迟渲染
光源处理 适合光源数量少的场景 适合光源数量大的场景
透明物体 支持 需要额外的技术实现
抗锯齿 MSAA FXAA、TAA
开发难度 较低 较高
性能 较低 较高
适用场景 简单场景、光源较少 复杂场景、大量光源