分享|米哈游技术总监:从手机走向主机,《原神》主机版渲染技术分享( 六 )
文章插图
从前面的描述可以看出来,模糊处理和Upsample加起来一共有三个pass,这就意味着AO需要被读取和写入多次。而且你如果你了解Bilateral Upsample的话,大家可以知道相邻的像素之间有很多的计算其实都是重复的,所以我们采用的优化方式是将所有的计算都放到一个compute pass里面去做。然后通过LDS来保存blur的中间值,通过同时输出四个像素的方式,来重用相邻像素的计算。最终我们还可以通过async compute pipe把性能开销进一步降低。
文章插图
关于我们的Local Light,我们在游戏里面采用了Clustered deferred lighting。我们支持视野内同时出现最多1024盏灯。大概的做法是我们将屏幕分成64×64像素的tile,然后每一个tile在深度的方向上面继续分为16级的clusters。通过这两个图,可以大概看出我们能够支持多少灯。
文章插图
这张图是一个游戏里面的截图,是一个典型的通过Local Light的阴影提升画面的情况,多个不同的Local Light,它们的照明范围是交错存在的,然后角色也投下多个不同的阴影朝不同的方向,画面就显得细节很丰富。
文章插图
我们怎么做的呢?我们的Local Light 阴影系统支持接近100盏灯的实时阴影,理论上我们可以支持更多的,不过这已经很够用了。阴影的分辨率是根据优先级和距离进行动态调整,最终的阴影是通过烘焙的静态场景阴影和实时生成的动态场景阴影结合得到的。游戏里面有很多的Local Light,如果每一个Local Light都去烘焙它的shadow texture的话,会占用的硬盘空间非常大。而且因为是深度贴图,所以不能够随便使用BCn的压缩,那样瑕疵会非常风险,所以需要一个好的算法来对于烘焙的shadow texture做一个压缩。这个压缩需要在精度损失足够低的同时,还要保持压缩率足够高,同时我们的解压开销要非常小才行。
文章插图
我们开发的这个系统是在离线制作的时候,对于shadow texture做一个压缩,尽量地去保持精度,运行的时候解压的速度也非常快,用compute shader去解压的情况,1K×1K的shadow texture,我们解压只需要0.05毫秒,可以说非常非常快。
文章插图
那压缩率和压缩质量呢?我们先介绍一下压缩的算法思路。首先我们对于shadow texture按照一个2×2的block来进行编码,每4个深度值,我们用32bit来保存。如果想要降低精度损失,可以选择高精度压缩,这种情况之下每个block的大小变成64bit。编码的方式有两种,一种是基于深度平面方程的方式,或者是通过压缩的浮点数方式。编码完成之后,还要进一步通过一个quad tree来合并编码以后的数据,进一步提高压缩率。quad tree是每个tile要保存一个,而每个tile又包含了16×16个block,大家可以看到下面的三个图,从左到右分别是没有压缩的深度贴图,中间是我们的平面方程编码的视图,最右边是我们quad tree 0到4级的深度视图,黑的地方是深度为0的区域。我们参考了Li Bo在2019年Siggraph上面的讲座,大家有兴趣可以去看一下。
- 召唤兽|梦幻西游:亚运会电竞项目公布了,没有梦幻西游,但我能理解
- 召唤兽|梦幻西游:周末客户端卡顿的解决方式来了,有人说重新登录就行
- 金刚伞|梦幻西游:这波师傅不背锅,把金刚伞看成金刚石,说师门被暗改了
- 长乐|梦幻西游:买大唐送法系神器吗?大唐的12火神器增加的是法伤属性
- 藏宝图|梦幻西游:两款游戏不能共存吗?某玩家玩梦想世界,梦幻号被封了
- NFT|日本游戏巨头史克威尔艾尼克斯将进军NFT链游领域
- 德莱文|LOL手游:暴力德莱文登顶国服第一德莱文,小吴被称手游文森特
- 怪物猎人|一周热游神评论:雷神不香了?胡桃两天流水32国登顶,收入直逼雷神
- 打野|LOL手游上线1天暴露难题,上单没了TP,打野太无脑,辅助成摆设
- 手游|LOL手游第二波魄罗宝箱爆率提高?开玩笑,清风:气到人没了