一直看到有人说老任技术落后,干脆把我之前写的文章搬到泥潭来做个动森渲染技术的科普,原文链接:https://zhuanlan.zhihu.com/p/166114434。图片全是屏摄,请大家见谅。另外第一次在s1发长文,不知道排版会不会有问题
最近玩动森玩了不少时间,稍微研究了下动森的渲染,觉得还是挺有意思的,所以写个文章记录一下。纯肉眼看,没有用模拟器抓过帧,可能有错误,望大家指出。另外补充说明截图后面有空补。 首先,遗憾的是,本作在掌机和底座模式下都是锁30fps,而其在主机上的前两作都是60fps。根据泄漏的消息来说,本作采用的是和Splatoon 2,Super Mario Maker 2以及Arms同样的引擎,而这三者都是稳60fps,所以我猜任天堂很可能最开始也是往60fps的目标去的,后来大概为了清晰度贡献了帧数(毕竟不是动作游戏)。不过考虑到底座模式1080p,掌机模式720p,以及更多本世代渲染技术的运用,我觉得这个30fps的tradeoff还是值得的。另外一提,本作的物理引擎也是接的havok。 在野外的时候,动森用了一种独特的俯视角,这个视角既有好处又有坏处。好处是物体的在z轴方向非常容易被剔除,半透明物体不容易overdraw,而且很多不需要支持旋转的物体建模的时候不用建模背面(比如树)。坏处是天空这类远算量小的元素只占了屏幕很小的面积,而地上很容易平铺很多道具,且很难被剔除掉。尤其动森支持任意数量道具的随意摆放,更加重了这个问题。而在室内的时候,由于一次只渲染一个房间,渲染压力**降低,因此也允许了自由视角的相机。 动森支持多光源,除了日光/月光的平行光外,各类诸如油灯,篝火的道具也有光照效果,不过点光源的光照范围一般来说都不大,可能是为了性能考虑,防止重复计算。另外游戏里的各种射灯的体积光就是一个半透明mesh。我的猜测是用2d raymarch去做体积光对多光源和射灯的支持不好而且性能差,所以任天堂就用mesh去trick。稍微感觉有点可惜吧,毕竟switch上的第一方游戏已经选择性的实装2d raymarch了(比如荒野之息和奥德赛),但是还是主要针对平行光用(像路易基的鬼屋3的手电筒光柱就还是mesh)。 (这个场景里全是实时光:1个平息光+5个聚光灯,值得一提的是啥影子都没有) 游戏里只有平行光投射阴影,诸如草之类的小物体也有阴影。阴影的话,没有发现级联阴影的痕迹,估计因为俯视角的原因,没必要做。不过阴影剔除比我想象的要激进一些,当物体和视线接**行的时候(当在屏幕上方的时候)就不会渲染阴影了,连光照似乎都不计算了。软阴影用了pcf做滤波,不过这个滤波质量做的并不高,放大看能看到条带状pattern,但是因为软阴影区本身比较细,所以倒不明显。动森里的阴影有三个层次:平行光阴影+垂直阴影投射(人和大物件有)+屏幕空间环境光遮蔽。其中垂直阴影投射对于人来说就是脚下放了个圆片,对于树这类的就是放近似形状的面片来达成遮蔽效果(怎么感觉和奥德赛这类平台跳跃做法类似)。说实话不是很懂为什么,给人物加个圆片还能解释为部分室内场景没有投射阴影的光源所以用圆片来模拟一下,但是给其他物体加就比较奇怪了,大概是为了提高阴影的层次感?不过从我目前的观察情况来看,三层阴影经常会导致画面显得有点脏,尤其对于人物来说,感觉这里没有处理的很好。说到屏幕空间环境光遮蔽,对比荒野之息和异度之刃1/2,个人觉得动森实现的精度更高一些(大概也是因为动森牺牲了其他特性而且ssao距离较窄的原因),而且对画面质量的贡献还是挺大的。目前第一、第二方switch游戏上ssao的还是不少的,前段时间的纸马也上了。 (pcf做的比较糙,这里看的不明显可能是因为图片多次压缩的原因) (四瓣叶子有垂直投影(比较淡)+平行光阴影) (注意此时左上角的房子是有灯光的) (离开一定距离后,左上角房子上的灯光消失了) (草也有阴影,而不是只有ssao) (室内只有垂直投影+ssao的情况) (室内只有平行光阴影+ssao的情况) (室内所有阴影都有的情况,老实说我也不知道这些阴影到底按什么规则出现的) 值得一提的是,动森里的半透明物体是写入深度的(指的是玻璃这里的,至于水面我个人并不确定这是不是半透明物体),所以会ssao出现artifact。一个很明显能观测到这点的地方就是水族馆,你可以很清楚的看到水箱里的海草,鱼这些东西周围有一圈ssao。 (黑边很明显,不是屏摄质量差导致的,就是ssao,也许是为了表示出轮廓或者水里的流动感?) (多层半透明混合,效果可以看) 仔细想想,奥德赛和鬼屋3里也是半透明写入深度,所以这大概是任天堂第一方惯例了?关于半透明物体叠加,除了正常的object级排序外,有时候动森也会用和奥德赛一样的做法(鬼屋我还没观察到这种场景),对于半透明内部的物体用screen door transparency或者叫dithered alpha。在奥德赛里,半透明玻璃箱子里的月亮就是这样做的;在动森里,装虫子的笼子里的虫子翅膀也是这样的。嗯,反正能看,性能也还行,要求不要太高啦,反正俯视角你也看不到多少重叠的半透明物体啦。 【此处为错误内容:】反射效果并不多。室内的反射效果看上去是一个非常低分辨率的cubemap去做的,这个cubemap似乎只受墙纸的颜色影响(不确定地板影不影响,但是室内的道具是不影响的),另外不需要做成动态的,在切换墙纸的时候渲一下就行了。而且由于只有墙纸和相当低的分辨率,直接在一帧内全画好就行了(甚至可能就是直接copy 6次)。 【此处为修改后内容:】cubemap受四面墙壁(窗户和门),地板和天花板的影响,并不是单纯拷贝6次墙纸图案,下图可以看到门和窗都画出来了。不过总的来说,specular reflection出现的并不多,主要还是靠打调色光+边缘光。 (注意这个金属球,看上去是白的是因为墙纸是白的,地下有地板红色的反射) 水面相当的opaque,而且高光和一般常见手游水面有很大区别。高光只有在固定光柱mesh下(可能是直接叠的特效面片)和与视角接**行的时候才会出现(屏幕上部分)。我猜这是为了钓鱼机制服务的,因为过于连续频繁的高光会影响玩家对于鱼影位置的判断,而且细节损失容易导致玩家误判鱼上钩的时机。 景深是1/4分辨率。沙地上脚印的做法就是一个带法线的贴片,和荒野之息,奥德赛的做法一致。前几天烟火大会更新后周日晚上放的烟火带来的光照变化是直接改平行光的,简单粗暴。另外烟花大会送的墙纸有个视差效果,虽然没有很强的立体感,但是乍一看还是挺唬人的。这个效果我不太清楚怎么做。不是parallex map,纹理本身没有立体感,还是平面,但是贴图上面的不同区域随视角变化移动速度是不同的,也许就是一个简单的uv offset? (明显降分辨率的景深) 另外,一如既往的,任天堂本家游戏从来没有抗锯齿,sharpness over alias,配上这个风格,还行吧。 总结,出了这么多第一方游戏,感觉任天堂的技术选型和画面要求大概也能够猜到了: 对于强竞技类游戏基本都主机模式下target 1080p 60fps。这类游戏往往场景比较小,优化起来比较方便,而且技术上除了pbr以外不会考虑本世代技术(比如smm2,splatoon2,mk8d),基本靠任天堂对于pbr材质强大的掌握能力增添画面。 对于非竞技类但是强动作游戏,主机模式下target 900p 60fps。作为强调单机的游戏,场景会比较大,会考虑上一两个“本世代”画面技术,在ssao,体积光,ssr,bokeh dof里面选(比如奥德赛)。 对于不那么强调的动作的游戏,主机模式下target 1080p/900p 30fps,在更多的本世代技术和分辨率里面做选择(比如鬼屋3,荒野之息,动森,另外我其实想提名新纸马,但是毕竟还是主要靠烘焙光)。 对于某g开头公司做的游戏,技术方面就是shi,国产手游都能吊打;至于异度之刃,我只能说,别赶工。 (btw,switch那个双击home键可以放大一部分屏幕的功能真好用,看细节非常方便。
|