游戏引擎中的光照算法
2019-01-12 12:13 风恋残雪 阅读(3775) 评论(1) 编辑 收藏 举报前言
今天我们来聊一下游戏引擎中的光照算法,从最开始的Forward Render,到后来的Deferred Render再到后面的Clustered Forward Render以及Clustered Deferred Render,分析一下实现步骤以及它们的优缺点。
Forward Render
这个是最传统的方法,对于多光源的处理比较有限,它的基本算法如下所示:
一般游戏引擎为了减少批次和处理光照的次数,会让每个物体受影响的光源有个上限比如3个或者4个,而且一般是在一个shader里面直接处理多个光源的情况。这个在最开始的游戏引擎中比较常见。目前基本上只会使用在移动平台上。比如Unity和UE4移动平台的低配版本都是这样的。
Deferred Shading
随着游戏中支持光源的数量越来越多,传统的Forward Render已经不能满足游戏的需求,Deferred Shading应运而生,这个技术基本上是从Deferred shading in S.T.A.L.K.E.R. 进入大家的视野的。基本思路如下图所示:
基本上GBuffe的内容大体如上图所示,当然目前大多数引擎为了支持多材质一个会有一个字节用于写入Material ID或者Shading Model ID(UE4)来区分不同的着色模型。
Tiled Deferred Shading
Tile Deferred Shading就是在Deferred Shading基础上按一定像素大小分块(比如32x32),计算每一块中光源的数量,这样我们可以对多个光源计算光照只读取一次GBuffer信息,节省了带宽。
Deferred Lighting
Cryengine3早期版本中使用过该技术,大体算法如下图所示:
这个算法跟Deferred Shading差不多,目前基本上没有引擎再使用这个方法。
Forward Plus Shading(Tiled Forward Rendering)
Forward+ Rendering最初是从AMD的论文Forward+: Bringing Deferred Lighting to the Next Level开始流行起来的。基本算法如下图所示:
Clustered Forward Rendering
在Forward+ Rendering的基础上又沿着相机深度的方向切了很多片。
Clustered Deferred Rendering
Clustered Forward Rendering也即是在Tiled Deferred Rendering的基础上又沿着相机深度的方向上进行了切片。
切片算法
总结
到这里我们把基本的光照算法都讲一遍了,读者可以看到上面的这些光照算法无非就是下面的几种组合:Forward/Deferred + (Tiled/Clustered)?,这里?代表0或1。演进过程是这样的,最开始只有传统的Forward Rendering,为了解决多光源的问题,引入了Deferred Rendering,带来了很多好处,包括各种后期效果。但是带宽是个问题,于是出现了Forward Plus(Tiled) Rendering解决带宽问题,也就有了Tiled Deferred Shading,但是还可以进一步优化,那就是在Tile的基础上再切片,于是就有了Clustered Forward Rendering和Clustered Deferred Rendering。下面我们列个简单的表格来对比下他们的优缺点。
光照算法 |
优点 |
缺点 |
Forward Rendering |
|
|
Deferred Shading |
|
|
Forward+ Rendering |
|
|
Tiled Deferred Shading |
|
|
Clustered Forward Rendering |
|
|
Clustered Deferred Shading |
|
1、带宽消耗大 2、MSAA和透明渲染支持不友好。 3、显存消耗大。 |
从上表可以看出,这些算法的优缺点基本就是Forward/Deferred以及Tiled/Clustered优缺点的组合。
参考文章
- http://download.nvidia.com/developer/presentations/2004/6800_Leagues/6800_Leagues_Deferred_Shading.pdf
- https://www.slideshare.net/guest11b095/a-bit-more-deferred-cry-engine3
- https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter09.html
- http://www.yosoygames.com.ar/wp/2016/11/clustered-forward-vs-deferred-shading/
- https://www.gdcvault.com/play/1014915/Lighting-in-Crysis
- https://pydonzallaz.wordpress.com/2013/08/23/gdc-europe-2013-shining-the-light-on-crysis-3/
- https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter09.html
- https://takahiroharada.files.wordpress.com/2015/04/forward_plus.pdf
- https://www.3dgep.com/forward-plus/
- https://www.slideshare.net/takahiroharada/forward-34779335
- http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf
- http://www.humus.name/Articles/PracticalClusteredShading.pdf
- Forward+: A Step Toward Film-Style Shading in Real Time -- GPU Pro 4
- https://www.gdcvault.com/play/1025420/Cluster-Forward-Rendering-and-Anti
- http://www.dice.se/wp-content/uploads/2014/12/GDC11_DX11inBF3_Public.pdf
作者: 风恋残雪
出处: http://www.cnblogs.com/ghl_carmack
关于作者:专注游戏引擎,关注VR,对操作系统、编译原理有深厚兴趣!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架