惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
A
About on SuperTechFans
博客园 - Franky
Engineering at Meta
Engineering at Meta
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 叶小钗
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
Last Week in AI
Last Week in AI
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
V
V2EX
G
Google Developers Blog

机核

游戏性能旗舰最强之选,一加 Ace 6 至尊版国补到手价2999元起 6元钱自己更换电动车刹车线 《生化危机9:安魂曲》编剧Haris Orkin专访 摸金游戏?音乐游戏!暗区新赛季这把能弹的琴有何来历? 好评国产武侠SRPG《息风谷战略》免费DLC现已推出 | 机核 GCORES 碎片 《生化危机:安魂曲》将于5月实装首个免费更新内容 | 机核 GCORES 新锐东方游戏,谱写世界新章! 沉浸式恋爱视觉小说游戏《心象演算》免费试玩版现已正式上线 | 机核 GCORES 互动影游《代号三国:龙起》上线!穿越三国与曹操并肩、与佳人同行、与权谋博弈! 《老头收集梦想生活》,游戏酒桌会6,录音笔VOL.689 | 机核 GCORES 破界·共生——《白日梦:无限世界》五大核心游戏特点解析 价格已到史低,锐龙5 9600X/锐龙7 9700X正适合抄底 时间循环之旅即刻启程!《归环》一周目测试今日开启 热门在线韩游变魂游,洛奇衍生作能否打破“花瓶”魔咒? LG UltraGear evo 全新高端显示器系列:当“5K”遇见“AI”,不止强大,更懂热爱 反套路三国互动影游《代号三国:龙起》今日上线! 愿望单登记人数突破10万!备受瞩目的“女儿养成游戏” 《梦幻魔法公主》今日于Steam平台上线!限时八折优惠中 《黑神话:悟空》全球音乐会2026巡演将于4月29日12时开票 | 机核 GCORES “Snowguelike”生存肉鸽挖矿新作《蛙穿雪境》公布发售日期,5月7日正式上线 | 机核 GCORES 重塑移动办公、AI创作新境!全新华硕灵耀Air系列、ProArt 骁龙版震撼首发,创芯未来 均分88:《Saros》媒体评分汇总 | 机核 GCORES 上海烛龙公布合作遗迹探险游戏《吉时已到》首支预告片 | 机核 GCORES 首个独立游戏《萝薇日记》已上线Steam! 烛龙新IP《吉时已到》首曝,打造国内首款中式合作遗迹探险游戏 喜加一:《暗黑破坏神Ⅳ》国服现已开启限时免费领取本体活动 | 机核 GCORES 新版《生化危机》电影定于9月18日上映,官方网站现已上线 | 机核 GCORES 《冲就完事模拟器2》“星球大战”联动DLC正式宣布 | 机核 GCORES SteamController将于5月4日发售,售价99美元 | 机核 GCORES 事已至此,内存这么用也算省钱了,“2+1”非对称双通道应用实测
短篇图形学——从“打光”开始,聊聊延迟渲染
Hakumen · 2024-03-08 · via 机核

前言

前几天看羽毛直播的切片,里面有一段他提到场景要做得好看需要一个会“打光”的美术,还有弹幕提到用老黄的硬件以后直接配实时全局光照(RTX光追模式)就可以搞定了。

概念上来说这么理解没问题,但由于实时渲染毕竟有着诸多限制,而实际的玩家群体的高端硬件普及率没那么乐观,个人觉得还是有必要聊聊游戏引擎的“打光”是怎么发展到现在的。

图形学里很多概念强行翻译会丢失其准确性,例如Deferred Shading(或Deferred Rendering )中的这个“deferred”翻译成延迟就丢失了很多上下文。硬要说的话,这里的延迟更多指的是在一帧内渲染顺序上的变化,是一种不同的渲染思路。

这里面不会展开光照具体的算法,由于上一篇讲纹理其实基本也算介绍了前向渲染(Forward Rendering)的基本思路,这里从前向渲染的光照开始介绍:

1、前向渲染及其光照

前一篇讲纹理渲染的文章已经大概介绍过,对一个物体的前向渲染大致可以理解为多边形几何处理(矩阵变换)、读写深度缓冲、以及着色,三个步骤。着色往往可以多于一次绘制,我们把一次绘制的调用叫做Draw Call(有些绘制的调用可以批处理,被称为Batch)。对于着色上次只提到了纹理映射相关的问题,没有考虑光照。

传统管线中常见的光源中比较有代表性的有平行光、点光源、聚光灯、区域光源等:

1)平行光 Directional light——用于近似抽象地球上接收太阳光的情况,强度不随距离衰减,一般被作为主光源;

2)点光源 Point light——覆盖范围是球体的有限范围光源;

3)聚光灯 Spotlight——覆盖范围是锥体聚光灯形式,常用来模拟手电筒;

4)区域光源 Area light——光线追踪中会主要使用的光源形式,在传统管线中一般只能设置后用于预渲染静态物的光照贴图(Bake)。

前3者对于传统渲染管线来说都是实时光源。在前向渲染的着色这一步,如果有多光源的情况,实际上是每个物体逐光源绘制一次,最后一个物体呈现出的是多光源混合的结果。

(图中是我在Unity中摆的2个平行光加2个点光源的示例,并展示了4个drawcall逐步叠加上去的渲染结果)

在较新的实时渲染管线中,前向渲染的光照这一步也进行了调整,例如在一次绘制调用中带入一个主光源(MainLight 一般指平行光)和弱干个补充光源(AdditionalLight)进行计算,增加了单次计算量但减少了drawcall。光照计算还包含逐顶点(Per vertext)逐像素(Per pixel)两种方式,这里不展开了。

假设场景有1000个物体,想要设置大大小小100个光源,如果按照一个物体一个光源绘制一次,最多就会有十万次drawcall——即使能通过距离或者剔除筛掉一些,但是量级不会显著下降,这对于现有的大部分硬件都是一个遥不可及的数字了。所以对前向渲染来说,根本不是会不会“打光”的问题了,而是不可能大规模使用实时局部灯光。

2、延迟渲染(Deferred Shading)

延迟渲染(或延迟着色)的提出在当时主要就是提升可容纳的光源数量的。

假设待渲染的物体都是不透明的,在硬件越来越多的支持帧缓冲(Frame Buffer)后,其中一个想法就是把渲染物体的一些中间结果缓存到几何缓冲区(G-Buffer),后续对这个中间结果计算光照。这个过程被大概可以拆解为几何处理阶段光照处理阶段

几何处理阶段需要缓存的中间结果有以下几类——颜色、深度、法线(Normals)。

法线并不是在延迟渲染中才提出的概念,但确实是本系列第一次提到。简单理解法线是一个向量,描述了一个点的方向,在进行光照计算时会影响其结果;三角面和顶点有其对应的法线,如果引入法线贴图(Normal Map)还可以在像素级别来修改其法线,帮助呈现为视觉上更细致的模型表面。

渲染的过程中,物体法线及法线贴图通过空间变换后,每个像素的法线值就被缓存了下来。

在光照处理阶段,结合帧缓冲和之前提到的材质和灯光信息,就可以做光照着色了。此时每个光源每种材质(Per material per light )会对依据缓冲区的中间结果进行一次绘制。

(Wiki上的例子中Deffered Shading的渲染结果)

前文提到的1000个物体100个灯光的问题,在延迟渲染的管线下,假设都是统一材质,则最少只需要几何1000+光照100次绘制就可以实现了。虽然每次渲染比前向渲染需要更多的渲染带宽和帧缓冲,但至少(进行一些优化后)数量级上在2000年左右已经是可实现的了。

事实上这也是基于物理的渲染(PBR)材质被提出的一个重要原因,因为延迟渲染需要一个参数上有代表性的材质搞定大部分不透明物体渲染的情况——毕竟材质种类太多就会失去延迟渲染的优势了。

*延迟渲染也是硬件定制化的主机在某个阶段画质显得大幅领先于PC游戏的重要原因——既因为可定制化设计的帧缓冲,也因为主机游戏更关注写实化渲染,更少引入那些半透明的亮瞎眼粒子特效。

3、优劣比较

简单说一下前线渲染和延迟渲染的对比。

前向渲染:

优点

  • 支持半透明渲染;

  • 支持使用多个光照pass;

  • 支持逐物体光照计算(延迟渲染是渲染到帧缓冲,再一起计算光照,所以不支持每一个物体用单独的光照方式计算)。

缺点

  • 光源数量对计算量影响巨大,太多光源会严重拖慢性能;

  • 访问深度数据需要额外再渲染一张深度图,深度图对最终渲染结果没有贡献。

延迟渲染:

优点

  • 大量光照场景的情况下,优势明显;

  • 经过了剔除,只渲染可见像素,节省计算量;

  • 对后处理支持良好(帧缓冲中有深度、法线等信息)。

缺点

  • 对多重抗锯齿MSAA支持不友好(原理上导致的,帧缓冲已经丢失了物体原始的几何信息,因此无法正确超采样);

  • 透明物体渲染存在问题(透明物体需要按深度着色并混合,和帧缓冲的思路是违背的);

  • 占用更多的显存和渲染带宽;

  • 只能使用同一个光照pass。

至于什么是光照pass,可以简单理解为一套预定义的光照渲染计算流程,如数据结构定义、预处理、主函数等,这里不做更多展开了。

4、现代渲染管线

由于光追也已经是“现代”管线了,这里的现代建议理解成传统两种管线的改良版。这部分主要做一个概念上的介绍。

1)延迟光照( Deferred Lighting)

延迟光照主要是改进了延迟渲染中光照不够灵活的问题,并减少缓冲区的占用,某种意义上可以理解成是嫁接了前向渲染——因此光照处理部分能支持多Pass了,但也会带来更多drawcall。

2)分块渲染(Tile-Based Rendering)

基本思路是把屏幕空间分块进行并行的延迟渲染(TBDR),以充分利用GPU的特性。这个方案后续也有迭代和发展,产生了改进版PowerVR TBDR

前向渲染也有其对应的Tiled方案,又被称为Forward Plus(莫名想起某手机的命名方式)。

3) 群组渲染(Clustered Rendering)

简单来说就是对空间进行分块,然后按前向渲染或延迟渲染的管线进行处理,目标也是充分并行计算(这里面有一个物体跨多个空间的问题处理,不展开了)。

结语

无论是前向渲染还是延迟渲染,作为表现力的补充还需要引入各种基于预渲染或预采样的光照技术——如光照贴图(LightMap)光探针(Light Probe)环境反射CubeMapIBL),以及环境光等,这里不展开了。无论实时还是烘焙,都可能面对漏光问题,这就是一个需要依靠“打光”的经验来化解的问题,有兴趣的可以自行搜索了解。

另外,传统管线的中的阴影实现也是一个大课题。其实阴影的渲染伴随在以上各个管线的过程中,由于篇幅原因这里没法展开讲。

在光线追踪管线中,任何光线传播都会考虑其能量传递和损失,这一点带来的光照算法就完全不同于传统管线了。这也是光追管线无法和传统管线拼接使用的其中一个原因。

游戏开发商即使不开发光追模式,也必须开发传统管线模式,这是现在单机3D游戏的无奈现状(不是高精度画面更不用考虑光追了);基于相信Nvidia硬件采用的RTX全局光照方案,至少5年内都不会真正到来,即使到了下一个主机世代,中小开发者还是会继续使用各种改良后的传统管线作为主要的“现代渲染管线”。

最后是一些相关资料: