UE渲染管线简摘

参考自:虚幻引擎 4 渲染流程分析

大致流程:

1、Z-Prerass(剔除、计算深度)

有一系列的culling剔除不必要像素及几何体,生产SceneDepthZ以及后续绘制HZB buffer(格式为R24G8TYPELESS);

  1. 视锥体剔除、视口剔除、背面剔除、预可见性剔、基于CPU的软件查询剔除;
  2. 记录Z buffer深度

常见的剔除技术包括距离剔除(适用于小物体)、视锥体剔除(取决于视野和远近裁剪平面距离)、遮挡剔除(逐对象剔除,较费)、视口剔除(剔除视口外图片、可能产生新的顶点)、背面剔除(判定多边形朝向剔除背面图元)、深度剔除(管线后方、逐像素剔除)、预可见性剔除(可用于移动端、将可视状态存在单元网格中,影响运存和照明构建时间);
——不同几种剔除(Culling)在渲染流程中的使用总结


硬件遮挡剔除:用GPU硬件逐像素对比物体光栅化后的包围盒来查询遮挡;
软件遮挡查询:构建低分辨率的Z-buffer和物体包围盒在CPU中查询遮挡;
——Unreal Culling Methods
遮挡剔除的主流方案

2、Computer light grid(划分光照grid)

按屏幕空间将点光、聚光和reflection captures的光照按照屏幕空间分成通过compute shader相应的grid(具体shader代码在LightGridInjection.usf,灯光空间grid的Z宽度随深度按指数增长);
在真正计算光照时,我们可以用GridIndex来快速决定某点是否受到灯光影响。Lightculling的方法在forward下对于提高灯光的渲染效率是十分有用。

3、Occlusion query(物体遮挡剔除)

物体级别做culling,使用hardware occlusion queries(GPU query)的技术,在绘制前CPU向GPU发送查询指令,为防止交流瓶颈CPU将回读上一帧查询的遮挡结果;
在不透明物体的query pass中,所有的不透明物体会被渲染为一个occluder(包围盒);
灯光(点光源)会有一个ShadowFrustumQUeries(一般是画一个球体),反射则有 PlanarReflection queries(一般是画一个 Cube)

4、HZB generation

生成场景的Hi-z(Hierarchical Z),R16_Float 格式,这一步也就是对之前的zbuffer做连续的downsample。UE4.26不支持移动端的HZB
HZB buffer可作用于Image based 的lighting技术,例如SSR(屏幕空间反射)等等。

HZB:可理解为深度图的Mipmap,基于三个特性:object-space coherence(物体最近像素是否近于当前深度图buffer)、Image-space coherence(可先从最粗粒度的Z-buffer进行查询)、temporal coherence(对比物体包围盒和消隐场景八叉树节点信息)来进行查询加速。UE4支持Compute ShaderPixel Shader两种HZB构建实现(直接在CS中写UAV生成HZB的速度不如使用Gfx快,但经过优化的CS(使用TGSM等压缩)速度远快于PS。)。
屏幕空间反射:GPU中进行RayMarching、根据法线和视角计算反射向量,在屏幕空间步进到depth buffer存储的物体表面,取交点的物体历史帧颜色作反射颜色,需要额外的后处理Pass处理。(plane reflection需要二次渲染场景并将结果存储在纹理中,因此会使drawcall翻倍)
在屏幕空间步进的原因:在3D空间步进后线段后期易发生过度采样问题,屏幕空间步进可保证每个像素采样点不会重复步进;——图形学基础|屏幕空间反射(SSR)
HBZ构建细节:UE4 Hierarchical Z-Buffer Occlusion移动端移植
Mobile hierarchical z buffer occlusion culling

5、ShadowMap 渲染 (动态阴影)

渲染实时阴影的shadowmap,只计算标记为moveable物体的阴影;

  • 渲染方向光的阴影(一般渲染3split的cascade shadow),
  • 渲染stationary light下moveable物体的阴影;
  • 渲染movable light的阴影;(对于movable的点光源,UE4会cachecopy static物体的shadowmap)
6、G-prepass(渲染G-buffer)

(场景中有volumtric fog的话会先渲染)
即basspass,会渲染场景中需要的G-buffers;

  • SceneColorDefferd:包含了间接光照信息,例如lightmap和lightprobe(ue4叫ILC);
  • 场景Normal
  • 场景Albedo颜色
  • PBR Specular信息
  • 除此之外还有针对特殊shading模型的特殊Custom Data RT(例如 头发的tangent sss等)和Pre baked shadow factors RT,一般情况可能产生5、6个RT;

除了产生GBuffer的计算之外,在这一步UE4还会计算完间接光照的信息,主要包括采集lightmap信息(静态物体)和球谐函数信息(Indirect lighting cache或者Volumetric light map(半动态光照技术,相比于之前对每个物体做插值的 ILC机制,Volumetric lightmap能够更加细致的根据物体的空间位置对球谐函数probe做插值))

7、Velocity rendering(渲染速度buffer)

渲染一张R16B16UNorm,主要用于motion blur和TAA;

8、Pre-Lighting(渲染贴花、AO)

计算DeferredDecal(屏幕空间贴花)和AmbientOcclusion;
UE4的屏幕空间AO考虑了深度和Normal信息;
第一个pass(用了之前生成的HZB buffer)使用1/4分辨率的normal和depth计算1/4分辨率的RT, 第二个pass渲染一个全分辨率RT并与第一个combine;最后计算结果乘到SceneColorDeferred这个RT上。

涉及到通过BentNormal改善间接光的技术;

9、Lighting(光照)

优先处理translucent 物体的照明,再分别计算阴影灯光和非阴影灯光的standarddeferredlighting,此Pass后SceneColorDeferred RT就会包含最后直接光照的结果。

10、ImageBased lighting(屏幕空间AO及反射)

渲染屏幕空间的一些光照效果,例如SSR(屏幕空间反射)还有ReflectionProbe等等;

  • SSR:用之前的HZB在屏幕空间做Zbuffer的raymarching,当击中时SSR的shader会采样上一帧的RT来获得颜色,且每帧jitter和TAA结合来提高质量。
  • ReflectionEnvironment Pass:结合场景中的反射球和之前的SSR结果,叠加到SceneColorDeferred这个RT中。
11、Post Processing(后处理)

主要包括Temporal AA、 Bloom、EyeAdaption等等这些可以自定义的内容。

  • TAA:第一个pass会处理没被stencil的像素(例如有粒子特效的时候),会用到MainRT和velocity buffer;第二个pass会处理例如粒子这样stencilled的pixel。

    TAA的处理只包含动态的光照部分,也就是纯动态光照。

在DeferredShadingRenderer.cpp里,根据项目特点可自行优化渲染管线,比如开放世界可以考虑省掉Pre-Z的过程,或只用地表去画Pre-Z;对于NPR画面的游戏不一定要6-7个RT去做Deferred shading。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值