天天看点

[sig10]CryENGINE 3: reaching the speed of light

http://advances.realtimerendering.com/s2010/Kaplanyan-CryEngine3(SIGGRAPH%202010%20Advanced%20RealTime%20Rendering%20Course).pdf

siggraph10的paper。

总体看下来,crytek在处理很多我们还没发掘到的问题,看着有种无力感。

另外感觉crytek在逐渐从engineer升级到scientist,说是大师级也不为过。

 texture compress improvement

 看着就比较烦,

  • 一顿搞---做的时候用16bit的texture,然后histogram normalize什么的,然后出来的效果得放大了才能看出些许优势。
  • srgb space的texture

normalmap用3dc格式压缩---大家都这么干。

但是crytek又要改进算法,还是在很少的情况(很近很精细)下才会有不同可以看出来。

在看一些类似车的表面的时候,平滑中带着些许糙面的情况,16bit的normal优势很大。 

 occlusion culling

console上是把上一帧的zbuffer downsample几个mipmap,然后用hi-z的算法在cpu端针对obj的aabb做culling----省了大量的cpu和gpu的计算。

pc上是使用比较传统的手工occluder,因为cpu-gpu带宽太低,没法搞zbuffer的传输。

 ssao

轻描淡写的一页,里面充满了名词,好几个不懂

  • encode depth into 2 16bit channel
  • quater buffer
  • bilateral blur fetch----囧
  • VolumetricObscurrance with 4! samples----囧
  • reprojection 

最后是720p情况下:360 1.1ms, ps3 1.3ms,orz!

 deferred pipeline

 lighting model:

• Indirectlighting – Ambientterm – Taggedambient areas – Localcubemaps – Localdeferred lights – DiffuseIndirect Lighting from LPVs – SSAO • Directlighting – Alldirect light sources, with and without shadows 使用的是light prepass, format:

  • 24bit depth, 8bit stencil----各种mask信息的存储
  • 24bit normal, 8bit glossness

 normal

这一块觉得巨给力。

用24bit存normalized normal会精度很差:

[sig10]CryENGINE 3: reaching the speed of light

其实24bit真的已经很多了,可以存储相当大的信息量,足够了。

之所以精度不够根本原因是我们存的是normalized normal,这样一来,只用了%1.73的理论存储能力。

crytek给了算法利用到了%98.2,因此也获得了非常高的精度:

[sig10]CryENGINE 3: reaching the speed of light

算法和代码文中都给了,大致思路就是根据normal的方向取一个最接近的方向来存(因为最终存起来的是离散的定点数),存的这个不是normalized的。

然后在lighting的时候只要再normalize一下就可以了。

的确相当巧妙,这种高效利用存储的空间的思想真是太太太给力了。

 后面一部分将phong brdf,这个目前的lighting model和这个在玩家看起来没有明显差距。

说实话关于这里,halo3在社区里画面质量和gears of war相提并论真是让我很不爽,甚至说gears更好。

halo3在理论上明显高出一截的。

需要硬件继续发展,到了更具区别能力的shading model的时候才行了。

hdr

力求在同样带宽上实现hdr效果,ps3上rgbm,360上用r11g11b10的格式。

最后tonemapping的时候有exponential tone mapping和film tone mapping,两者各有千秋吧。

clip volume

不用shadow的话,lighting容易出现bleeding的情况,解决办法是放置一个clip volume用stencil mask来解决。

anti aliasing

crytek上来说msaa和mlaa都没法解决画面在变化时候的闪烁问题。

尤其是在很细的地方,栏杆,草这些东西。

也就是说关注点已经不是静态画面,而是动态时候的画质问题。

这个我稍微抱有怀疑态度,找了些mlaa的video,觉得还是没有太大问题:

http://www.desivideonetwork.com/view/tji5w7378/incredible-killzone-3-mlaa-incorporated-gameplay-and-graphics-best-looking-game-ever-made/

还有战神的一些video。

crytek的解决方案是继续用reverse projection,记录变化的地方,然后对这些地方blur,来降低camera移动时候造成的flicker。

静态画面上是edge aa.

最后看credit:

•VaclavKyba from R&D for implementation oftemporal AA

• CarstenDachsbacher for suggestions on the talk • HolgerGruen for invaluable help on effects • IvanNevraev and David Cook for consulting on Xbox 360 GPU • YuryUralsky and Miguel Sainz for consulting • PhilScott, Sebastien Domine, Kumar Iyer and the whole Parallel Nsight team • TiagoSousa, Sergey Sokov and the whole Crytek R&D department 这就是大师级crytek和其他工作室根本区别所在。

继续阅读