还记得第一次打开《最终幻想VII 重生》大地图的那个瞬间吗?我站在草原上,屏幕上是大片沐浴在阳光里的格拉斯兰,风在吹,草在动,Cloud的头发丝一根根分得清清楚楚——这个画面,放在JRPG里绝对算得上第一梯队。但玩了200小时之后,某个不对劲的细节开始卡在喉咙里,不吐不快。草叶贴地的地方没阴影,石头缝之间该暗的地方还是亮的,整个场景看久了,总觉得“浮”着一层说不清的平光

原来不是我一个人这么觉得。这两天逛N网,刷到一个叫David Matos的Modder发的新项目,标题直白得可以:一个直接往《最终幻想VII 重生》渲染管线里注入修改版Shader的Injector工具。更让我愣住的是他配的技术演示视频——那个视频里跑出来的画面,跟你现在硬盘里躺着的重生简直不像一个游戏。

打开网易新闻 查看精彩图片

事情要从几天前说起。Matos公开了一段演示,展示了他改造过的一版UE4延迟方向光像素着色器。别被绕口令一样的名词劝退,核心就两件事:第一,他升级了这个着色器里的BRDF算法;第二,他手动给游戏加上了屏幕空间光线追踪阴影以及微阴影。这两项东西一叠加,直接改变了整个画面基础的“扎实感”。

你玩过重生的都懂,游戏里大量的小物件、草叶、地面碎石,在实际操作过程中根本不参与阴影计算。角色在森林里跑,脚下踩的断枝碎叶没有一个能投出哪怕一小截影子。Matos的方案是用SSRT阴影把这些“漏掉”的东西补上。原本被阴影贴图排除在外的物体,现在可以从屏幕空间里估算出自己该落在哪片暗部,该跟哪个表面产生接触阴影。整张地图会突然变得“着地”,脚踩在地上就有了踩在地上的感觉。

Matos后来发了一篇长文解释他的技术路线,这篇文章读下来,我突然理解了一件事:重生的大地图光照,确实比它的前辈《最终幻想VII 重制版》要平。奇就奇在,这俩游戏用的是同一套魔改版虚幻引擎4。重制版的过场和实机画面质感多扎实啊,米德加贫民窟的金属管道底下全是暗部细节;轮到重生,你切回实机操作,那些小物件、植被、角色发丝的精细表面,很多情况下根本投不出任何阴影。

过场动画里,画面还是漂亮得能做壁纸。一回到可操作的大世界,光就“平”了下来。

原因按照Matos的分析,大概率出在重生那个大了好几个量级的开放世界上。为了撑住这么一大张无缝地图,开发组没法沿用重制版那套高精度预烘焙光照方案。重制版的地图是精心切割过的线性场景,光照数据可以预先算死、烤进贴图里,出来的效果自然扎实。但开放世界的动态时间、动态天气、大范围地形,要把那套搬到重生里,光是光照数据存储量就得爆炸。

所以开发组做了一个很合理的选择:把重制版的高细节预烘焙光照,换成一套更轻量、更低分辨率、更适合大空间运行的动态方案。这是个正常的性能取舍,代价就是牺牲掉一部分阴影细节。说白了,这是用画面换来一张能跑起来的大地图。放到两年前刚发售那会儿,这个取舍在多数场景下是可以接受的;但等你真正沉进去逛了上百小时,那些缺失的阴影就慢慢变成脑子里拔不掉的倒刺。

为什么不能用更直白的手段来修?Matos在文章里也掰扯得明明白白。有人说,你直接上完整光线追踪不就完了?不行。这是开放世界,尺寸摆在那,全局光追的算力开销在这个级别的场景里根本扛不住,哪怕你拿一张旗舰卡去硬怼也拿不到稳定帧率。有人说,那把阴影贴图分辨率拉高呢?也不行。长距离下高分辨率阴影贴图的渲染缩放会出各种奇怪的问题,边缘锯齿、漏光、覆盖不全,而且大范围提升分辨率对显存的吞吃是指数级的。还有人说,多加几层阴影级联不就好了?这个更惨,每加一层级联,每一帧就要把整个场景重新绘制一遍。多画几遍意味着Draw Call暴增,帧率直接腰斩。

所以Matos走的是一条巧路:屏幕空间光线追踪阴影。这个技术本身并不新鲜,UE4引擎默认就自带这套实现,但《最终幻想VII 重生》压根没去用它。它的原理很有意思,不去为每个光源重新绘制一遍场景,而是只用屏幕上已有的深度信息来推算阴影。跟你熟悉的屏幕空间环境光遮蔽思路接近,只不过这次补的是阴影而不是AO。这个方法的强项恰好就是补那些小范围、近距离的阴影细节——比如头发与额头之间的阴影缝、草叶根部与地面之间的接触暗部、两个物体靠在一起时那条细细的遮挡线。而游戏实机画面里最欠缺的那层“着地感”,恰恰就藏在这些小东西的暗部里。

听起来一切都很完美?没那么简单。因为重生最终的着色器已经被编译成了不可直接编辑的二进制码,Matos没法直接打开修。他得先拿RenderDoc这个免费的图形调试工具去做逆向工程,从游戏运行时抓出显存里的着色器数据,还原结构,再在此基础上构建自己的改进版本。这一步是怎么做的他没细说,但我猜过程不会比解谜游戏轻松。

最难的是性能这一关。他早期版本的新阴影方案,单帧开销多出了3毫秒。对于一帧只给16.67毫秒的60帧目标来说,这个额外消耗是不可接受的。你不能为了画质提升把流畅度直接葬送掉。

于是这个老哥开始了好几轮的优化。先是把噪声模式换成了更友好的GPU采样方案,又大幅削减了每条阴影射线的采样数量。最终在原生4K分辨率下用一张RTX 3080跑出来的成绩是:阴影部分额外开销约0.44毫秒,仅为原本的光照着色器开销翻了一倍左右。换句话说,用很小的性能代价换来了一次肉眼可见的画面升级。

这个改善效果,你看过他做的对比图就知道多明显了。那些草叶、细碎的小石子、角色的发丝投影、两堵墙夹角里的暗部过渡,从“该有但没出现”变成了“精确落在它该在的地方”。先前我说游戏画面看着“浮”,根子就在这些东西上。一旦阴影信息补到位,整个场景会突然变得沉下去,物体之间不再互相“滑”成一张平面,而是各安其位,有了重量和距离。

这个Mod目前还没放出下载,但光是看到有人愿意去啃RenderDoc逆向、去搞清楚开发组当年在光照问题上到底做了什么取舍、再一帧一帧磨出可用的优化版本,这件事本身已经够让重生玩家兴奋了。PC版最大的价值其实就在这儿:即便官方出于性能考虑不得不压低某些视觉规格,玩家社区也有机会换条路子把细节补回来。

等这个Injector正式发布,我肯定会第一时间装上去再跑一遍大地图。不是为了看什么惊天动地的画质革命,就是想亲眼看看,那些默默躺在地上的小石子,第一次长出自己该有的那块影子时,这个世界到底会变得多踏实。