从技术的角度来分析一下沙盒服的新画质

前两天有幸收到了沙盒服的通过邮件,作为图形程序员果断翻出工具对新画质进行了一下分析,这里一步一步的给大家分析一下坦克世界的画面到底是如何渲染出来的(由于只能截取到各个Render Target的信息,所以很多东西只能凭经验去猜)
先来一张游戏的最终画面


楼主 carbonsunsu  发布于 2017-10-15 12:32:00 +0800 CST  
一开始引擎画了一系列奇怪的贴图,根据后续信息的猜测,估计是跟新的水面有关,应该是用来计算水面顶点偏移的,所以这次坦克驶入水中后水面会根据坦克的包围盒形成更加逼真立体的波浪,而之前(也就是咱们正在用的版本)只是用几张Normal贴图来表现水面波浪。


楼主 carbonsunsu  发布于 2017-10-15 12:37:00 +0800 CST  
这张Render Target应该就是波浪的计算结果,中间两个绿色的长条就是履带,周围的应该就是水面顶点的偏移值,然后根据这个来计算波浪的形状和高度等等


楼主 carbonsunsu  发布于 2017-10-15 12:42:00 +0800 CST  
接下来开始绘制履带在地面的痕迹的Mask,用来标记哪里有痕迹哪里没有,每张图上面一半是近距离高精度,下半部分是远距离低精度,然后根据距离啥相机的距离进行混合,第二张图是把痕迹叠加到场景Normal Buffer上,和之前绘制波浪一样,相机的角度实在玩家的正上方朝正下方看,而且还是一个正交投影的相机



楼主 carbonsunsu  发布于 2017-10-15 12:54:00 +0800 CST  
然后引擎在面板和小地图的那两个位置标记了一下,应该是用于后续的像素剔除,毕竟这两块地方挺大的而且没用,如果这些像素也参与到后续的计算中(比如光照、阴影和AO神马的)的话其实是完全的浪费,所以这样做能省掉不少的性能开销



楼主 carbonsunsu  发布于 2017-10-15 13:01:00 +0800 CST  
接下来是场景的G-Buffer(Geometry Buffer),虽然只是把一些信息写入到Render Target中保存起来,但这是Deffered Shading中很重要的一环,毕竟后续的几乎所有计算都要用到这几个Target中的数据
第一个是反射率(通俗点就是漫反射贴图或者Diffuse贴图);第二个是Normal;第三个用来存储一些渲染参数,第四个是Stencil Buffer,感觉像是把材质ID存了进去。
其中坦克世界自从模型高清就开始使用PBR了,所以几乎所有材质只需要两个参数:粗糙度和金属强度,所以第三个Target中R通道存储了粗糙度(坦克世界里应该改叫光滑度,毕竟他们的贴图1表示最光滑),G通道存储了金属强度,B通道存储了边界信息(也就是边缘检测的结果)




楼主 carbonsunsu  发布于 2017-10-15 13:16:00 +0800 CST  
接下来引擎有绘制了两张贴图,可以肯定这俩应该是两张表(只不过是用颜色的方式表现出来),用来给后续的渲染计算快速查询数据的,这种手段在图形开发中挺常用的,后面只要采样一下贴图就能获得本该要经过计算才能得到的数据



楼主 carbonsunsu  发布于 2017-10-15 13:25:00 +0800 CST  
接下来绘制了坦克的G-Buffer,数据结构和之前地形的一样




蛐蛐感觉挺好玩的啊。。。准备出一辆


楼主 carbonsunsu  发布于 2017-10-15 13:33:00 +0800 CST  
接下来引擎只是简单标记了一下天空


楼主 carbonsunsu  发布于 2017-10-15 13:56:00 +0800 CST  
接下来引擎开始计算AO,并把结果存储在一个Target中,其中R通道是AO的结果;B通道是对AO进行边缘检测的结果;G通道没太明白有啥用,看着感觉像是换了种方式计算的AO结果


楼主 carbonsunsu  发布于 2017-10-15 14:05:00 +0800 CST  
然后对AO的结果进行模糊来提高效果,感觉应该是用的双边滤波做的,因为边缘并没被糊掉,而用高斯滤波的话边缘细节会被抹掉,当然也有可能是根据边缘检测的结果来做高斯模糊,结果应该差不多


楼主 carbonsunsu  发布于 2017-10-15 14:11:00 +0800 CST  
接下来是渲染履带痕迹,但这块有点让人疑惑,最开始的时候渲染过一次履带的痕迹,只不过是从玩家头顶朝下看渲染的,而且是低精度,而这一步又绘制了一次,那么上一次到底有啥用呢。。。





楼主 carbonsunsu  发布于 2017-10-15 14:41:00 +0800 CST  
绘制履带痕迹之后,引擎根据模板缓冲区中的数据来渲染地面和植被,这里的画面看着比游戏中画面跟鲜艳的原因应该是由于坦克世界采用了线性空间光照,所以当前结果的颜色是在线性空间,经过显示器显示之后就看着对比度更强


楼主 carbonsunsu  发布于 2017-10-15 14:48:00 +0800 CST  
接下来引擎开始渲染水面,先是根据履带计算一个包围盒




然后绘制水平面,并计算水的深度,用来混合水面颜色和地面颜色



楼主 carbonsunsu  发布于 2017-10-15 14:57:00 +0800 CST  
这一步引擎计算了水面与坦克和地形的边界并存进了一个Target的R通道,同时将地形与坦克位于水面以下那部分的金属强度参数存进了同一个Target的B通道,应该是由于后面G-Buffer的信息被覆盖掉了,所以单独保存一份,而G通道保存了水面到水底的深度,同时在模板缓冲区也标记坦克位于水面以下的部分


接下来根据前面的数据更新G-Buffer,将水的颜色与水下的地面与坦克的颜色进行混合,同时其他的数据(比如材质参数)也被水面覆盖掉


楼主 carbonsunsu  发布于 2017-10-15 18:18:00 +0800 CST  
接下来,引擎计算了一些数据存到了一个Target里,用来后面计算屏幕空间反射用,这个技术也是这次画质升级新加的,现在咱们所使用的版本中水面反射的实现方式是将需要反射的东西以水面为中心倒过来再渲染一次,这种方法虽然可以表现出很完美的反射,但是如果场景复杂度很大(比如新的场景中增加了很多小部件和植被),那么对性能的损耗会很大,毕竟相当于全部东西画了两遍。而屏幕空间反射则是重复利用了已经计算好的像素,而且是在屏幕空间进行(类似于一种后期效果),这样相对减少了一些运算同时计算反射的性能损耗与场景的复杂度完全无关了,当然最后的效果可能会有些瑕疵(比如只能反射到屏幕中出现的东西),但还是能接受的,所以现在几乎所有的3A级游戏都会有这种技术,和PBR一起几乎成为了次时代的标配。
但在沙盒服玩的时候发现,新的版本中实际上两种反射的计算方式是并存的,就是当屏幕空间反射计算不出结果是用传统的反射方式代替,但我觉得这样其实没必要,完全可以用一个当前的场景的静态天空盒来作为补充,虽然效果差一些但能相对减少一些性能的损耗,毕竟大部分时间屏幕空间反射就完全可以渲染出很好的反射效果了


楼主 carbonsunsu  发布于 2017-10-15 18:38:00 +0800 CST  
然后渲染物体在水面上的阴影


楼主 carbonsunsu  发布于 2017-10-15 18:43:00 +0800 CST  
接下来渲染坦克以及一些其他物体的光照及阴影


楼主 carbonsunsu  发布于 2017-10-15 18:45:00 +0800 CST  
然后是计算屏幕空间反射


楼主 carbonsunsu  发布于 2017-10-15 18:48:00 +0800 CST  
接下来根据之前水面的数据(比如深度)把反射的结果叠加到水面上,同时加上水面的阴影,并根据波浪的数据对顶点进行偏移,形成最终的咱们看到的波浪,同时通过一些噪声来增加水面的细节(比如小波纹)


然后再用粒子渲染一些水花并把结果叠加到上一个结果中,形成最终的水面效果

楼主 carbonsunsu  发布于 2017-10-15 18:59:00 +0800 CST  

楼主:carbonsunsu

字数:3041

发表时间:2017-10-15 20:32:00 +0800 CST

更新时间:2020-06-20 11:03:43 +0800 CST

评论数:200条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看