虚幻引擎 4 渲染流程分析 http://www.52vr.com/article-2104-1.html

UE4渲染系统结构解析 http://www.yanglajiao.com/article/jiangdengc/60141724

Unreal Engine 4 的渲染流程总复习 http://gad.qq.com/article/detail/22342

虚幻引擎 4 渲染流程分析

今天为大家带来的是转载自虚幻引擎爱好者王文涛的博客文章《虚幻引擎 4 渲染流程分析》,这篇文章通过 Renderdoc 的分析通俗地介绍虚幻引擎 4 的渲染过程。

UE4作为当今商业引擎界的大佬,渲染和图形质量一直是首屈一指的水准,但是相对于unity来说UE4基本上是一套完整方案提供,不通过源码修改对渲染进行定制的可能性比较小,而且同时UE4这方面的文档很少,因此这篇文章就是想通过分析UE4的渲染过程,来给大家针对自己使用ue4开发的游戏的内容特点做出优化带来启发。

我们使用Renderdoc对UE4(PC,DX11)截帧,UE4的版本为4.18. 可以看到UE4一帧画面的渲染过程如下

可以看到的是整个渲染流程还是很清晰明了的,接下来就会逐步分析每个过程。

1.Z-Prepass
UE4在deferred shading 过程之前这个,会有一系列的culling过程剔除掉不需要的像素或者几何体,基本上可以猜测是UE4是为了减轻后期在deferred shadinggbuffer 生成中的庞大计算量,第一遍的zpass会先渲染一遍场景中的几何,用于生产SceneDepthZ以及HZB buffer,格式为R24G8TYPELESS

2.Compute light grid
在Pre-Z之后UE4会把场景中的灯光按照屏幕空间分成相应的grid,类似于cluster shading的方法,注意这里的grid只考虑点光源,聚光灯,以及reflection captures,UE4这一步是通过compute shader实现的,所以只在sm>5.0的平台上有。具体shader代码在LightGridInjection.usf,阅读代码之后我们可以发现 UE4的灯光空间grid的划分是按照指数增长的。也就是每个grid的z随着距离会增长。

在真正计算光照时,我们可以用GridIndex来快速决定某点是否受到灯光影响。Lightculling的方法在forward下对于提高灯光的渲染效率是十分有用的,但UE4在DS下仍然保有了这一个过程。其效果存疑,初步推测是为了和UE4新加的Forward renderer统一。

3.Occlusion query
这一步在light culling之后,和Pre-Z pass 不同的是,Occlusion query 主要在物体级别做culling。ue4同样使用的是hardware occlusion queries(GPU query)的技术。在这一个pass中,所有的不透明物体会被渲染为一个occluder(包围盒):

在根据深度计算query之后,query的数据会传回cpu,我们就可以计算每个物体有多少像素可见。这样我们就能知道物体最终是否会被渲染。

在不透明物体的query pass之后。Unreal 还有一些其他的query pass,例如灯光(点光源)会有一个ShadowFrustumQUeries(一般是画一个球体)反射则有 PlanarReflection queries(一般是画一个 Cube)

4.HZB generation
接下来UE4会生成场景的Hi-z(Hierarchical Z),R16_Float 格式,这一步也就是对之前的zbuffer做连续的downsample。HZB buffer会在之后的计算中起到很多作用,特别是Image based 的lighting技术,例如SSR等等。

5.ShadowMap 渲染 
接下来的一步就是渲染shadowmap(shadowDepth,注意,这里指的是实时阴影的计算。根据UE4中灯光类型的不同,实时阴影的计算也有一定的差别。
UE4中的灯光类 型分为stationary, static,moveable三种,相应的每种灯光cast realtime shadow的方式也不同。

对于stationary light,静态物体的阴影会bake到static shadowmap,shadowmap只计算标记为动态物体的阴影,而对于dynamic light 会对所有物体投射阴影,而静态灯光不会产生实时阴影。

ue4首先会渲染方向光的阴影,一般会渲染3split的cascade shadow ,所以我们能在截帧信息看到split0, split1和split2,注意cascade split数目在ue4中也是可以在方向光参数中设置的变量。

之后是stationary light的shadow渲染,注意这里只针对场景中的moveable的物体。

最后是对于movable light的渲染,对于movable的方向光,ue4仍然是cascade shadow map计算阴影,需要注意的是对于movable的点光源,ue4使用了cubemap shadowmap,在cubeshadowmap的第一个pass CopyCachedShadowMap中,ue4会直接cachecopy static物体的shadowmap,例如这个场景中

圆柱体为static,其他两个物体设为movable,因此最后我们能看到Shadow 只画了两个几何体。

最后动态物体的shadow会添加在这个cubemap上面。

注意 shadowcubemap使用了geometry shader来选择画在那个面上。

6.G-prepass
其实在g-prepass之前还会渲染一个volumtric fog(如果场景中有的话) 这里我们先跳过,
G-prepass就是ue4中常说的basspass,这个bass会真正的渲染场景并产生我们在deferred shading 中需要的G-buffers:

SceneColorDefferd:包含了间接光照信息,例如lightmap和lightprobe(ue4叫ILC)

场景Normal

场景Albedo颜色

PBR Specular信息

除此之外还有针对特殊shading模型的特殊Custom Data RT(例如 头发的tangent sss等)和Pre baked shadow factors RT,一般情况下UE4的渲染需要5-6个RT输出,除了产生GBuffer的计算之外,在这一步UE4还会计算完间接光照的信息,主要包括采集lightmap信息(静态物体)和球谐函数信息(Indirect lighting cache或者Volumetric light map)
UE4在4.18引入了新的半动态光照技术也就是Volumetric lightmap,相比于之前的 ILC机制,Volumetric lightmap能够更加细致的根据物体的空间位置对球谐函数probe做插值(ILC是每个物体做插值)

Volumetric lightmap的Texture3d

7.Velocity rendering
在basepass之后是Velocity rendering,Velocity buffer会渲染为一张R16B16UNorm,主要用于motion blur和TAA

8.Pre-Lighting
UE4在这一部分会计算DeferredDecal(屏幕空间贴花),和AmbientOcclusion, UE4的屏幕空间AO考虑了深度和Normal信息,UE4的SSAO分为两个Pass,第一个pass会计算一个四分之一分辨率的RT,使用的是四分之一分辨率的normal和depth, 注意这里就用了之前生成的HZB buffer,第二个pass会渲染一个全分辨率RT并与第一个combine.注意最后计算的结果会乘到SceneColorDeferred这个RT上.

9.Lighting

接下来就是光照的渲染部分,UE4在渲染灯光光照时会先处理translucent 物体的照明。

在这之后会分别计算阴影灯光和非阴影灯光的standarddeferredlighting,

在这个pass之后,SceneColorDeferred RT就会包含最后直接光照的结果

10.ImageBased lighting

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

SSR会用到我们之前生成的HZB,在屏幕空间做Zbuffer的raymarching ,同时ue4的SSR会每帧jitter和TAA结合来提高质量。当击中时SSR的shader会采样上一帧的RT来获得颜色

在SSR之后是ReflectionEnvironment Pass。这一步会结合场景中的反射球和之前的SSR结果会叠加到SceneColorDeferred这个RT中。

11. Post Processing
最后一步是UE4的Postprocessing,主要包括Temporal AA; Bloom;EyeAdaption等等这些可以自定义的内容。

UE4 的TAA会经历两个pass,第一个pass会处理没被stencil的像素(例如有粒子特效的时候),会用到MainRT和velocity buffer,第二个pass会处理例如粒子这样stencilled的pixel。两个pass的区别在于混合当前RT和History buffer的blendfactor的不同,第一个pass的blendfactor会根据pixel的亮度距离等等变化,而第二个pass的blendfactor啧固定为0.25,也就是说第二个pass的像素会更多考虑当前像素,很可能这是为了减少TAA中很常见的ghosting effect

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

以上的分析还是省略了很多的细节,例如半透照明这种还没涉及。从整体的流程分析来看,UE4在设计渲染方案的时候还是最大限度的考虑了功能的最大化,UE4的DS renderer包含了非常齐全的光照特效,包括静态的lightmap,动态的lightprobe,屏幕空间的lighting,以及一些影视级别的渲染技术,例如头发的渲染模型等等,但同时为了功能UE4的计算任务是很繁重的,因此也就不难理解为什么UE4需要Pre-Z和Occlusion Culling去剔除掉不用的像素。当然,对于使用UE4制作游戏的团队来说,根据游戏内容特点,画面的艺术风格,渲染管线都没必要一成不变,例如对于一款开放世界的野外生存游戏。我们可以考虑省掉Pre-Z的过程,或者,只用地表去画Pre-Z,又或者对于NPR画面的游戏我们完全可以不需要6-7个RT去做Deferred shading。UE4应对这些定制化开发的需求的方法就是:开源。代码就在DeferredShadingRenderer.cpp里。

unreal 渲染讲的比较好的材料相关推荐

  1. qt 读取gif一帧_译:Unreal渲染一帧详解(Unreal Frame Breakdown)

    译者前言: 上一篇文章,我补充翻译了"How Unreal renders 1 Frame?"的第三篇,在找资料过程中,又发现了一篇挺好的文章,同样是基于"How Unr ...

  2. Nicholas谈UE4高级渲染:动态光照迭代快

    GameLook报道/6月5日,2015年第三期GameLook开放日‧虚幻引擎专场活动在上海正式举行,此次活动由Epic Games与GameLook联合主办. 如何用好UE4引擎,发挥其强大的画面 ...

  3. 比较 Unity 与 Unreal 的 VR、MR 或 AR 开发项目

    Unity vs Unreal - how to decide which engine to use in your next XR project Unity vs Unreal--如何决定在你的 ...

  4. python在化学方面的应用-学材料、化学的要不要担心人工智能抢了自己的饭碗?...

    原标题:学材料.化学的要不要担心人工智能抢了自己的饭碗? 材料人应用AI开展材料.化学研究入门讲座第一讲--AI介绍已圆满结束.关于人工智能会对材料.化学领域的研究产生怎样的影响,老师在讲座中也进行了 ...

  5. 史上最详细 VUE2.0 全套 demo 讲解 基础4(条件渲染)

    作者 : 混元霹雳手 - Ziksang 三篇基础发布之后,收到最多的就是谢谢楼主,其次的就是错别字有点多,这篇我肯定写完之后读三遍,现在已经是夜里2点了,如果还有没有发现大家就容忍一下,这次我将要讲 ...

  6. 产品运动动画用什么软件做的_3C产品渲染用什么软件好?Keyshot,工业设计必备!...

    " 最近 看到一组很不错的3C产品渲染图 想跟大家分享 " 这组作品,来自专业商业渲染师--许胜达,他专注3C类目产品方向,擅长产品打光.材质表现.场景搭建渲染等.  许胜达 海界 ...

  7. 渲染多层材料的综合框架

    下面是对2014年TOG上的一篇论文的翻译. 论文题目:A Comprehensive Framework for Rendering Layered Materials 这篇文章的技术已经被用于pb ...

  8. 详谈PCB电路板结构系列之PCB材料组成笔记

    可能有一些硬件工程师会画PCB,但是对于PCB的构造,缺模模糊糊,对PCB的板层结构没有清晰地认知,我认为,会画PCB,不仅仅就局限于对简单的PCB的绘制,要在高层的PCB有所提升,但前提要了解PCB ...

  9. 使用VMD中的Tachyon渲染出透明逼真的水盒子效果

    1.概述 在本教程中将重点向你展示如何通过VMD中的Tachyon制作一个高质量的可视化图像.本文假设你对vmd有一定了解(最基本的打开载入分子即可).关于vmd制作图像的快速入门中文教程,本例所使用 ...

最新文章

  1. php laravel框架项目实例
  2. 进大厂必须掌握的50个微服务面试问题!
  3. 分享两个JavaScript打乱数组顺序实现随机排序洗牌的方法(应用于音乐视频的随机播放等)
  4. Django的Field(字段)
  5. 嵌入式Linux启动过程中的问题积累
  6. html 中怎样显示enum,JavaScript如何枚举?
  7. Linux操作寄存器前为什么要ioremap
  8. 转:PHP网站在Linux服务器上安全设置方案
  9. 如何解决区块链钱包更新慢问题?
  10. qt4 mysql_qt4连接mysql_MySQL
  11. 福建省计算机应用考试成绩,福建省高校学生计算机应用水平考试成绩查询
  12. PHY芯片88EE1111 MDIO接口调试
  13. mie散射理论方程_A. Mie米散射理论基础
  14. 大数据在企业中起到什么作用
  15. idea报错:Invalid bound statement (not found)
  16. .NET 指南:构造器的设计
  17. 可能是求质数最高效的算法
  18. 机器学习Sklearn Day1
  19. 教你炒股票13:不带套的操作不是好操作!
  20. JAVA数组常见例题(转置,排序,求和平均,插入,删除)

热门文章

  1. 【GameMaker】加速Runtime下载
  2. 【Fungus笔记】No.12:Load Scene(加载场景 / 转场)
  3. redis之复制之谜(二)
  4. FPGA概念理解之:ZYNQ、PS、PL、APU、ARM、SOC、URAT、GPIO...
  5. Binary Search Tree(二叉搜索树、二叉查找树、二叉排序树)
  6. c语言静态检测工具,静态代码检测工具---PC-lint(for c/c )
  7. [转]网易新闻客户端为什么开始在北京市区的地铁、公交站牌大批量投放广告?...
  8. 做金融理财直播,直播内容有什么?
  9. 危与机并存 保险业如何走好线上线下业务并举转型之路?
  10. UNITY与Mac⭐一、在苹果电脑上配置 Unity 安卓环境的教程