[siggraph2011]Secrets of CryENGINE 3 Graphics Technology

来源:互联网 发布:昆仑触摸屏编程软件 编辑:程序博客网 时间:2024/04/30 01:00



Crytek图形三巨头NickolayKasyan, NicolasSchulz, TiagoSousa 轮番轰炸,73页的一个ppt。

link:http://advances.realtimerendering.com/s2011/SousaSchulzKazyan%20-%20CryEngine%203%20Rendering%20Secrets%20((Siggraph%202011%20Advances%20in%20Real-Time%20Rendering%20Course).ppt

                                                                                                                                                                                                                  

SlimGBuffer

  • ARGB8 for world_space_normal & glossness
  • D24S8 for depth buffer
  • 2xARGB18F做Diffuse&Specular
  • ARGB16F做scene render target
                                                                                                                                                                                                                  
CoverageBuffer

使用类类似dice的方法,不过dice是纯在cpu端construct low res depth buffer,crytek是从cpu端把depth读回来。
然后对物件的AABB或者OBB做rasterization,进而和low res depth buffer做比较看可视性。
resolution的对比是:
1080P的depth buffer会down scale到256*128
rasterizer bounding box是在另一个线程里做的。
pc上有大约4帧的延迟。
比较酷,效果各种好,但是要一个额外线程做。

                                                                                                                                                                                                                  
室内外的ambient

这里是处理室内室外不同ambient的情况,比如这样:

做的方法是当deferredlighting来做,可以:
  • 用stencil标tag
  • 画全屏quad(室外),bounding box(室内)
                                                                                                                                                                                                                  
EnvironmentProbe
采用artist摆probe的方法,这里对到底存了什么东西在这个probe没太说清楚,猜测就是cube map,然后画model的时候当environment map读取。
不过它里面提到了specular cube map和spherical light volume,不太清楚什么情况,beyond3d上求助ing。
不同probe之间使用linear blending,这个倒是比较常用的了。

                                                                                                                                                                                                                  
各种上流光照:
里面各种缩写相当欠扁,crysis2缩写成c2。。。
  • GI----light propagation volume
  • SSDO
  • real time local reflection(RLR)
  • normalized blinn phong模型
  • 直接光照的render基于光在屏幕上的覆盖率,有
    • fullscreen quad with stencil volumes
    • convex light volume
    • 2d quad
只这一页就秒杀游戏无数。。。
                                                                                                                                                                                                                  
DeferredShadows

对于阳光的shadow,有做shadow mask,全黑的地方就可以直接跳过light shading。
使用cascaded shadow map,里面用的一些名词说的不太清楚,

csm里面的shadow cascade分布是核心问题,crytek使用logarithmic texel density distribution,也就是尽量保证shadow map texel到screen space pixel mapping的比率随着cascade的增加一步步1/2这样的减少。
shadow frustum是使用保守的方式来包camera frustum,激进方式会导致camera在不同方向shadow的texel distribution不一样,shadow质量一会高一会低,这样也不好。
shadow map texel snap,这个很早就提了,frustum在变的时候是以texel为单位,就不会有shadow的锯齿在camera缓慢移动的时候慢慢走的artifact了。
可能接受阴影的地方在stencil buffer中标记出来,这样有助于有更好的cascade划分。
shadow cascade caching:也就是有些cascade几帧才update一次。
最远的cascade使用vsm,来获得非常大的半影区。

point light shadow:
使用6个方向的shadow map来做,使用texture atlas来减少memory fragmentation。
会受光的地方同样使用stencil标记。

soft shadow approximation
这张阴影图帅爆了:

图中可见,这个是近处的shadow半影区小,远处的大,属于percentage closer soft shadow。
crytek使用poison pcf还带在shadow space随机旋转的kernel。
半影区的设定和percentage closer soft shadow基本一样,基于kernal内sample点的平均距离,决定舍弃多少。

transparency shadow map,使用8bit的render target来accumulate alpha value。
                                                                                                                                                                                                                  
real time local reflection
没什么太多好说的,屏幕空间ray tracing,该gloss的地方gloss。
基本上主要是gloss的地方比较适用,清晰反射的地方会受限于screen space很多信息不全,bug不可避免。

                                                                                                                                                                                                                  
contact shadow map
也就是ssdo,直接看ssdo的论文吧。

ssdo的效果显著的高于ssao,在screen space里面完成。

                                                                                                                                                                                                                  
screen space subsurface scattering
在screen space对diffuse lighting(accumulated)做scattering。

screen space self-shadowing
screen space里做一些ray casting(在lighting的方向),这,也,太,猛,了,从来没想过,效果很不错:
crytek的理论和trick能力。。。服了


                                                                                                                                                                                                                  
SoftAlphaTest

典型处理的问题就是头发的问题了,需要额外的一个pass,在screen space做tangent方向的blur。
                                                                                                                                                                                                                  
这里dof,motion blur(说了好多遍了)和3d(不感兴趣)的部分跳过。
                                                                                                                                                                                                                  
bonus
一些额外的分享:
  • hdr+linear space lighting非常重要,两者结合的画质提升非常明显
  • shadow acne是指图中一层层感觉这部分的bug:

    • 起因:
      • low shadow texel density
      • depth buffer的精度不够
    • 几个解决方案
      • sunlighting: front face render+slope depth bias
      • point lighting:back face rendering
      • variance shadow map: render both faces