版本4.23.1

    1. GPUParticles Perpass
      UE4渲染一个场景首先会进行GPU粒子的预pass,主要是进行粒子系统的模拟
      image.png
      2. 场景的perpass
      通过这一次场景的perpass,会生成场景的Depthbuffer
      image.png
      值得注意的是,虚幻4是,对于Z取反了的,越近 取值为1,越远越接近为0。这样可以在深度范围内实现更高的精度(浮点数的表示),并减少远处网格物体上的z-fighting。可用于虚幻4的延迟贴花渲染,ssr,ssao之类的
      3. ComputeLightGrid(Light assignment)
      image.png
      计算光源的的覆盖网格,跟分簇渲染的光源渲染方式类似,计算每个光源的影响范围
      5个光源 2个反射probe
      4. shadowFrusumQueries
      //可能是为了提升shadowmap的精度,查询阴影视椎体。
      5. BeginOcclusionTests
      遮挡测试,也是一个比较大的环节。
      viewOccusionTest, z注意到其中除了view的测试,还有shadowFrusumQueries,也是为了剔除掉不在view和shadowview共同视锥体下的object
      虚幻4的剔除默认使用的是hardware occlusion querises方式
      1)渲染场景的所有东西到depth bufer。
      2)创建occlusion query,用以判断object是否被遮挡。Queuery会返回通过z-test的像素数量,如果像素为0,则说明完全被遮挡。通常来说渲染整个pop mesh进行遮挡测试是相当昂贵的,所以通常仅适用prop的边界作为判断依据。
      3)将查询结果回传到CPU,来决定submit哪些prop到GPU端进行渲染。(即使只有很小的像素被覆盖也有可能进行提交渲染,另一个方面也说明,渲染的模型不要很大很大整个,这样会导致即使有很小的一角没被遮挡,整个pop也会提交渲染)
      image.png
      这样的方式缺点就在于依然是由“drawcall”以及CPU-GPU的数据上传带宽,数据同步的问题。从GPU到CPU数据传输是很慢的。
      CPU-GPU同步之间,一般都是有帧缓存的,所以UE跟其他一样,采取的queries的方式,一次提交多帧进行pass,也就是说我们可能还是会submit到没有出现在当前场景中的props
      (实际中,还会使用相机视锥体去进行遮挡剔除,所以也不是很大的问题)。这个问题并不容易解决,UE4采用了如下方式去 缓解:首先渲染所有不透明的物体到z-buffer,之后为每个props单独进行遮挡测试,最后,在每一帧的结尾从前一帧或后一帧,查询检索数据,并确定props的可见度,如果可见,则标记为下一帧可渲染。(跟图片上对应的,所显示group queries然后是individual queries)另一方面来说,如果没通过,那么就会加到最多8一个一组的group中,进行更大的boundingbox 判断,如果下一帧这个group变得可见,那么会进行拆分进行单个的可见性判断
      6. Hi-Z buffer generation
      像mipmap一样的分层次 精度的Z-buffer
      image.png
      7. shadow rendering
      为各种光源生成shadowmap,cascaded map
      虚幻4采用的altas的方式收集渲染到一张shadowmap上,而对于动态的点光源,虚幻4采用的是传统的cubemap方式。对于stationary 光源进行性能测试时,最好先bulid,不然虚幻4可能仍会当做移动光源渲染cubemap
      8. Volumetric Fog
      image.png
      UE4实现体积雾通过以上三步
      1)InitializeVolumeAttributes 计算并存贮fog参数到体积纹理,并且存贮一个全局的发光强度到第二个体积纹理。
      2)Lightscattering 结合方向光的阴影,天空光照,局部光照计算每个cell的光源散射(也是有TAA和Computeshader 的输出的)
      3)FinalIntegration ,简化Z轴的光源匹配3Dtexture,计算散射光以及透过率






      9. G-prepass
      image.png
      可以看出UE4先渲染的是SKY,虽然一般可能最后渲染sky,因为sky最远,很多像素上其实最后还是要被覆盖的,但是由于前面已经有Z-pass了,所以可以利用zbuffer,渲染sky
      image.png
      Gbuffer使用的rendertarget
      image.png

      image.png
      image.png
      还有E留给custom Data
      还可以从输入中看到许多预计算的信息
      image.png
      10 Velocity rendering
      计算移动props到分散的buffer中,屏幕上二维的动量,所以精度可以高一些使用R16G16的buffer,用于像 TAA,动态模糊之类的
      11 Ambient Occlusion
      image.png
      image.png
      AmbientOccusionSetup主要是为了ambitentOccusionps提供1/4分辨率normal(depthbuffer由之前的hi-zbuffer提供),会有随机采样加抖动的方式来进行AA
      12 Lighting
      虚幻4照亮半透明物体,采用的是插入2x64x64x64,RGB16的体纹理,两张纹理存放球谐函数的参数,每个光源的近似方向等等。对于近的物体采用高分辨率,而对于较远的物体就采用级联阴影的方式。
      image.png
      虚幻4会将光源分为两组,一组nonshadowlights,一组shadownedlights
      NonshadowLights分为两周经,sample light(粒子效果使用的灯光),非阴影的普通场景灯光。两者之间的区别是 普通场景灯会使用深度包围测试,近似避免光照像素超出光源体积。另一个区别是场景光源不会写到半透明光源体积中。






      对于shadowedlights
      首先计算屏幕空间的阴影(shadowProjectionOnopaque),之后它会被插入对于光源的贡献(InjectTranslucentVolume)到半透明光源体积最后计算场景光源(standarddeferredlighting)
      image.png
      13 Image sapce lighting
      SSR 屏幕空间反射
      image.png
      UE用的光线匹配方式,利用computeshader计算SSR
      image.png
      UE4还有静态的反射预计算,可以从上图中缺少了moveable的椅子,而static桌子还在
      Fog and atmospheric effects
      image.png
      Transparency rendering
      半透明物体渲染,
      Ue4有两次 Transaprency
      一次是场景的半透明物体,一次是粒子系统中的半透明粒子
      image.png
      在渲染场景中普通的半透明物体时,也会受环境光照,直接光照,bake贴图等的影响,使用复杂的半透明shader。
      image.png
      计算particle 的时候,也会像半透明物体一样,在顶点计算大气散射,雾等
      Distortion
      进入distortion 后分为两步
      1)distortionaccum,所有的半透明物体和粒子将重新pass,写入distortion vector到resolutionbuffer中用于第二步计算折射。
      2)Distortionapply,也就是 refraction calculation,在这一步进行折射的计算,输出一张refraction的texture。在这一步中有两次pass,一次添加refraction,一次添加粒子。
      14. Post processing
      虚幻4有大量的后处理,TAA,motion blur,bloom,tonemap。
      虚幻4的TAA是用两次pass,一次直接blenderfactor 融合history,另一次将当前帧与historybuffer再次融合,factor为0.25,应该是为了减少ghosting。