一个做驾驶游戏的开发者,被水面效果卡了大约七个月。最后让他满意的,不是更真实的物理参数,而是一组"不现实"的数值。
在海外论坛Reddit上,驾驶游戏《Everroad》的开发方EverroadGame发布了一组游戏画面比较图。两张图是同一个画角,唯一的区别是水面表现,但整体氛围差别明显,评论区给出了大量称赞。据这位开发者说明,效果是在自定义着色器里把各种参数设成非现实数值后实现的。
《Everroad》是一款在浏览器上运行、免费游玩的驾驶游戏。它没有终点也没有分数,世界由种子值程序化生成,玩家在一条没有尽头的路上随意行驶。游戏包含海岸、森林、草原、高山、沙漠五种生物群系,还有瀑布潭形成的湖泊、海岸外漂浮的小岛这类观景点。行驶途中天气会变化,四季也会更替。玩家可以开着游戏内电台,交给自动驾驶,慢慢看风景——整体是一款偏放松的作品。
开发这款游戏的RetroDev Games,是位于新西兰、由Rein与Revathy夫妇组成的独立工作室。在Reddit发帖的用户EverroadGame,是Rein的另一个名义。他原本主要是Unity开发者,但本作是把自研的自定义引擎与Three.js组合起来开发的。让它在浏览器里跑起来的各种办法,都公开在开发博客上。目前公开的版本是面向Web的演示版。
这次公布的比较图,是水面着色器开发约七个月的成果。旧版水面颜色几乎只有一种,除了海岸线之外看不出波浪;新版则通过细密的光反射让水面显出起伏,并且能透过水面看到水下的地形。画面深处闪亮的光点发虚,看起来是游戏内拍照模式的景深效果。两张图只有水面表现不同,却引来了大量称赞。开发者本人也说,连近处的道路和草木都显得有生气了。
他最初用的是在Unity积累的技术:用制造扭曲的波纹特效、配合色调调整这种平面化的做法,去调出能真实反射和吸收光的水面。但这条路没能做出想要的样子。于是他改用WebGL的着色器语言GLSL,写了自定义着色器,通过调整不同时段的颜色、透射距离、闪烁的量与强度、天空反射等参数,做出了现在的水面。
有意思的是,这些参数都被调成了脱离现实的值。他自己也对"非现实设定反而改善了观感"这件事至今感到疑惑。不过即便如此他仍不满足,还在想能不能让画面更好看。
把观感放在物理准确之前,并不是孤例。海盗题材开放世界动作游戏《盗贼之海》(Sea of Thieves)的世界与角色是卡通风格,却因水面表现漂亮而获得很高评价。据开发方Rare的说法,他们在表现水时先调查了其他工作室和好莱坞电影的做法,尽可能还原照片级真实的水的举动,再在此基础上按美术的意愿做风格化。看上去鲜艳多彩的"像水一样的东西",举动本身是真实的,因此看到的人会给出"和真的几乎一样"的感想。
Unity官方论坛上也出现过类似讨论。在关于渲染管线HDRP(High Definition Render Pipeline)Water System的帖子里,有人指出水的折射率(IOR)是固定的,从水下往上看时非常难看,并主张应当允许物理上不准确的折射率。Unity工作人员对这个意见表示认同,承认从水下往上看时,折射率会让视野变得非常窄,加上散射色,眼前的东西很难直接看清。对方以《使命召唤 现代战争II》的水下影像为例,回答称很可能会追加一个让折射失效、物理上并不准确的选项。
Unity官方博客上,Roguelite动作游戏《Ignitement》的开发者Sørb介绍了火焰的表现手法。通常火焰用粒子表现,而这样做往往会损失物体之间的交互。本作改用动态、实时的二维流体模拟代替粒子,做出了能与雾、墙壁相互作用的生动火焰。流体模拟由带有密度、速度、温度等物理属性的多张纹理实现。
光照方面,他们把火焰形状降采样转换成动态光照贴图,再提亮对应区域的纹理,以此表现火焰的亮度。火焰、雾和光照在技术上只是纹理在动,却产生了有体积感的伪3D表现。这位开发者说:"不必物理准确,看着好就行。"
此外还有关于游戏里浮在水面的船、为什么船内部不显示水面的讨论,其中介绍了多种实现方式:用模板缓冲设定不绘制的区域,或用深度缓冲放置不可见的网格。真要物理准确,就需要对船和水面做流体模拟,而这个例子同样可以说是优先观感的结果。
这种思路有时也进入游戏系统本身。比如《星之卡比 探索发现》中,画面上看起来攻击打中时,即使实际"没打中也会判定为打中"。有了这套机制,不擅长3D动作的玩家也更容易打中。
在游戏开发里,把观感放在准确之前是相当普遍的做法:强化光和颜色、让折射失效、设定不绘制的区域、扩大判定范围。刻意画出物理上不准确的夸张现象,反而让玩家觉得"更像真的",这样的情况确实存在。《Everroad》用非现实数值大幅改善观感,大概也是同一个道理。如今开发引擎的进步让物理准确的表現更容易复现,但刻意采用非现实的数值,也许能换来更好的画面。
