渲染流程整理

这篇文章讲的很好:https://gameinstitute.qq.com/community/detail/123220

 

首先是pc的IMR模式,每次draw命令提交就进行渲染。假设提交了一个树,那么就需要去执行渲染。

这中间需要访问深度缓存,模板缓存,纹理等,都直接通过显存去获取。需要大带宽。例如考虑要执行alphatest操作,其实就需要直接访问fbo,然后根据alpha值进行操作。再如Blend,也是把当前结果和背景混合,也需要去访问fbo。

然后是手机的TBR模式,它不会来一条命令就马上执行,因为如果这条命令印象了全部的fbo,那么你不得不把所有的fbo又写回显存的fbo中,那么来一个写一个,不就和前面的没啥区别了。为什么不多执行几步再写回呢,于是,所有的draw提交后,先执行顶点着色器,完成后得到一堆图元。

这些图元按照坐标分配给不同的tile。tile保存着所有图元的列表。同时还有他们的深度信息,模板缓存信息。

然后开始执行光栅化和片段着色器。这中间需要深度缓存的时候,直接去tile里面的缓存拿就行,不需要从显存里读取完整的信息。

再考虑alphatest,我只要从tile里面的缓存获取对应的fbo,然后执行alphatest操作,操作完了,我把整个缓存写回到显存的fbo中。这样比把整个fbo拿过来,然后写完后又放回去要节省的多。

现在考虑这样的情况,前面draw了两棵树,第三个draw希望根据前面两棵树的结果做一次模糊。那么第三次draw之前,我们不得不首先执行前面说过的流程,得到渲染的结果。然后把它存到一个独立的fbo中。完成之后,当前缓存内容就没有用处了,我们开始执行第三次draw。

 

开始考虑Unity的后处理。如果是默认OnRenderImage的行为,那么首先,Unity为了兼容老机型无法直接从当前FrameBuffer读取数据的并写给自己的特点,需要单独拷贝一份fbo出来。那么我们申请了一个新的fbo1,并且执行了拷贝。注意,因为切换了fbo1,所以触发了所有tile的绘制,并写回到fbo0. 得到fbo1之后,我们要重新写入fbo0,于是又执行切换。这个时候,因为tile里面的数据已经不是fbo0的数据了,所以我们只能重新从显存里读取对应的信息。这个过程会很慢,然后开始执行后处理脚本。执行完毕后,再重新写入到fbo0.解决方法是,在PreRender的时候,将摄像机的target设置成一张rt。那么所有的渲染都是往rt里面写。然后,从rt就可以直接写入到fbo0了,这个时候不需要任何额外的操作。

 

还有洛神的文章:

https://zhuanlan.zhihu.com/p/66407205

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值