![f515e35b7e61c43da6ecd82abea80830.png](https://i-blog.csdnimg.cn/blog_migrate/9ebeb8f105e77d21519fc53830f105bf.jpeg)
在上一篇文章中我们介绍了UE4阴影渲染的框架,本篇文章主要介绍剩下的部分的渲染,不过有些在上一篇介绍过的这里就不在重复介绍了,上一篇文章的地址如下:
Mage Anti:UE4渲染框架解析之阴影渲染zhuanlan.zhihu.com![38047ca08c2651808697aabf4f0bb706.png](https://i-blog.csdnimg.cn/blog_migrate/23fdaf40d0be864a9dd89bb2233ed2a3.jpeg)
在渲染完阴影之后,首先渲染CustomDepth。首先判断是否需要执行CustomDepth,如果需要执行CustomDepth的话,首先会分配DepthStencil Target,设置RenderTarget的Action;然后设置Uniform Buffer,之后调用CustomDepth的DispatchDraw函数执行CustomDepth操作;最后Resolve渲染得到CustomDepth贴图,至此该Pass的任务就结束了。
![4f26f5531f135e4cbd729cbbccd54876.png](https://i-blog.csdnimg.cn/blog_migrate/a84189067ef295399422b6a65d3a6fb5.jpeg)
![92cbc19e912e0203e48ded691c0befd6.png](https://i-blog.csdnimg.cn/blog_migrate/1a52645616a9ca1930f9956b457ebaec.jpeg)
在CustomDepth执行完成之后,就要准备渲染BasePass的RenderPass了,如下图所示,主要包括设置SceneColor、SceneDepth、是否需要Resolve等信息。里面比较重要的一点是ColorTargetAction,比如Clear_Resolve表示的就是Pass开始之前先清空RenderTarget,这个Pass结束的时候需要Resolve,其他的类似。
![6cf03fed2c52395a7d93d5eb8f40157e.png](https://i-blog.csdnimg.cn/blog_migrate/8bbdb7ac009c87e33ee8250833ffe938.jpeg)
![cf114a6bef185e72334e05f66f940128.png](https://i-blog.csdnimg.cn/blog_migrate/5aac2cfc061ea8479da587e556d7714f.jpeg)
上面的操作结束之后,就开始执行RenderMobileBasePass了,这个函数比较简单,主要就是设置Pass相关的UniformBuffer和之前的RenderPass中得到的Custom Scene Depth&Stencil以及SceneColorAlpha等纹理,之后就是调用BasePass的Dispatch函数执行绘制操作即可。
![ad5f972c16e2e663852cceac01e1d7e4.png](https://i-blog.csdnimg.cn/blog_migrate/b53137c66ca400458e52603f23df9f43.jpeg)
渲染完BasePass之后就需要绘制Occlusion Query了,这里也比较简单,一般游戏中使用到的情况也不多,这里就不多介绍。
![39127f83d08749cb92024c3b394bba16.png](https://i-blog.csdnimg.cn/blog_migrate/7d9d352ea1e591cae37ccb0441487834.jpeg)
完成上面的操作之后会根据需要决定是否EndRenderPass。如果使用了MSAA并且调用了EndRenderPass,上面的Pass绘制的物体会Resolve,当然这个也是根据需要决定的。这里就不详细的介绍什么时候需要EndRenderPass,主要还是根据需求。BasePass完成之后就需要渲染半透明的物体了。
![e4c10300ee71a31e460a983a1642ca10.png](https://i-blog.csdnimg.cn/blog_migrate/20611f1dd0a1a57bb252b082ddc9685d.jpeg)
从上面的代码来看,半透明物体的渲染的执行过程和BasePass的没什么区别,这就就不多说了。半透明的物体处理完成之后需要执行EndRenderPass,可能需要Resolve RenderTarget。
![7a90a1b1124c32b55830d6a9a4b9d21d.png](https://i-blog.csdnimg.cn/blog_migrate/957fc46f7ae877a46a7534fb7eb13449.jpeg)
等上面的处理完之后就进行最后的一步:后处理。
![726e0e9dcadba7f5bb63724091979047.png](https://i-blog.csdnimg.cn/blog_migrate/b47e61c0c6a16288e330a472bf91602f.jpeg)
后处理结束之后,执行RenderFinish,这里主要就是通知RHI,该帧已经结束了。
![9ff34797a5d7f4877b281a43ac0d2021.png](https://i-blog.csdnimg.cn/blog_migrate/cde51809ca13a642606b13b5c8dfab8a.png)
到这里,所有的渲染任务就结束了。当然,到这里可能依然不知道怎么修改引擎完成自己的任务,毕竟这个只是渲染的总体框架,里面的很多细节还没有涉及,不过也不可能在一篇文章中讲到所有的方面,之后有空会尽可能的结合实际应用场景讲解其中的一些部分,比如材质的管理、UniformBuffer的管理、Shader的管理等等。