下载RenderDoc
在UE插件中选择开启RenderDoc Plugin插件,在运行时使用来截帧,我们就能查看UE的渲染流程了。
前置阶段主要就是视角变换、投影、初始化参数那一套东西…
可以参考:GAMES101: 现代计算机图形学入门(1)变换、光栅化、着色
我们可以在右边查看其渲染的深度图,可以看到其是一张一张深度图依次渲染的。
这里其实我们点进去是能看到各个Mesh的顶点信息和属性的。
而顶点数据明显就是在PrePass和BasePre阶段进行输入的;而AO、Lights、PostProcessing中,则主要使用屏幕空间的三角形进行输入。
在下方BuildHZB中使用了HZB技术(Hierarchical Z-Buffer Occlusion Culling),就是使用Z-Buffer技术再根据对象的包围球半径,剔除在PrePass阶段中被其他对象遮挡的对象,在内部对mipmap分层,根据半径选择不同的层级的mipmap进行深度测试。
注意:这里的剔除是借助的ParallelFor的线性剔除而不是八叉树的方式。
BasePass中进行渲染,如果场景中有5个物体,每个物体都进行5次光照计算的话,最终5×5=25次,而延迟渲染则是将光照渲染计算延迟进行,首先每次渲染,将会把物体的BaseColor(基础颜色),表面法线,粗糙度,像素深度等分别渲染成不同的图片,然后这5个光源再进行5次计算,最终只会计算5+5=10次。
可以看出,首先ClearRenderTargetView,清空出了7张RT来进行接下来的BasePass渲染,再BasePassParallel中平行进行了6次渲染。
上面即6次渲染的结果,当然实际上7张RT都有绘制,这里只展示前3张,可以发现人物被分为了3次渲染、1次圆球、1次地板、1次椅子一共6次渲染,这也是整个BasePass的过程。而BasePass中的SceneDepth就是在PrePass中的输出值。
渲染的shader代码是放在引擎的\UnrealEngine\UE_5.1\Engine\Shaders\Private当中的,我们可以找到BasePassPixelShader.usf文件,存放了BasePass主要的shader码。根据源码将材质中的参数取出,根据输入的Mesh的几何体信息,在BasePass进行渲染时生成对应的shader代码。
之后对其进行Shadowmap的生成。
AO:新版本中使用Lumen代替了部分AO的操作,添加了一层环境光遮罩
输入之前BasePass的A、B的RT以及SceneDepthZ,在其中计算出屏幕整体的法线贴图
这里不对Lumen进行分析,以后会在新的文章对Lumen进行详细分析,这里Lumen做了很多运算,生成了很多图,最后将AO叠加进去,最终得到了下面这张图。
我们场景中存在一个directionalLight,因此这里对该光源进行计算和阴影生成。
如果不是平行光的话就麻烦了,因为点光源(非平行光)的话,照到摄像机已经剔除的物体,这下就渲染不出来了。因此需要判断摄像机是否在光照几何体中,如果在里面,就会关闭深度测试。
场景中的特定光源处理完后,会处理体积云、大气、高度雾,最后进行透明体处理。
以上,处理完毕后,输出结果仍是很糟糕,因此在后处理中进行反走样,曝光,调色等操作。
因此,在后续进行后处理操作。
最终生成还不错的效果。