译者前言:
上一篇文章,我补充翻译了”How Unreal renders 1 Frame?”的第三篇,在找资料过程中,又发现了一篇挺好的文章,同样是基于”How Unreal renders 1 Frame?”来进行了更进一步的尝试和分析,觉得可以把这篇文章也翻译一下,从而方便更多的读者。
这篇文章的优势主要是给出了一些更细致的GIF贴图,一一种动态的方式来让大家更好地来理解整个渲染过程。当然,在一些理论知识上的介绍,比原有的博文介绍的比较简单,大家最好对照着来看。毕竟两个场景是比较类似的。
原文链接:
Unreal Frame Breakdownviclw17.github.io作者:Victor Li,似乎是个华人,这是在他的技术BLog上发表的。
-----------------------------------------------------------------------------------------------
原文
这个是我自己版本的“How Unreal Render One Frame?”,我试着按照这篇博文来profile一帧来学习延迟渲染的整个过程。
我按照这篇blog来构建了一个测试的场景。首先将Unreal设置为”延迟渲染“,如果设置为”forward rendering“的话,整个渲染过程会有非常大的差异,后面我也会来介绍一下这个渲染管线。在我的测试例子中,umap被命名为NewWorld。它包含以下内容:
- 1个方向灯,从左上到右下
- 1静态光,白色
- 2个固定灯,均为蓝色
- 2个移动灯,一绿一红
- 标记为可移动的岩石网格
- 其余所有网格都是静态的
- 所有带有阴影的网格
- 1个火粒子系统
- 体积照明
- 天空盒
1、Particle PreRender
在GPU上进行粒子模拟(只有GPU Sprites Particle类型的粒子)。因为我们在粒子系统中有两个GPU粒子发射器,所以,粒子模拟的pass有了两个Draw Call。
EID | Event | Draw # | Duration (Microseconds)
| - GPUParticles_PreRender | 2 | 36.864
| - GPUParticles_SimulateAndClear | 2 | 23.552
| - ParticleSimulationCommands | 2 | 23.552
| - ParticleSimulation | 2 | 23.552
115 | - DrawIndexed(48) | 2 | 23.552
121 | - API Calls | 3 | 0.00
| - ParticleSimulation | 4 | 13.312
138 | - DrawIndexed(48) | 4 | 13.312
144 | - API Calls | 5 | 0.00
148 | - API Calls | 6 | 0.00
这个Pass会输出下面2个Render Target(RT):
1、RT0: 粒子的位置信息
2、RT1:粒子的速度信息
2、PrePass
PrePass获取所有不透明的(例如,使用opaque或masked的材质)mesh,并输出 Depth Z pass(Z-prepass)。 DBuffer需要其结果,也就是“ Forced by DBuffer”,这个过程也可以通过启动Forward Shading来启动。 pre-pass也可以被用于遮挡剔除来使用。