随着硬件的发展,我们可以看到GPU的计算能力远远的把CPU抛在后面,所以把更多的CPU端的计算放在GPU端,可以说是一个行业一直努力的方向。
渲染端cpu上面,一直以来,剔除和提交drawcall都是cpu做的,这部分一方面cpu可怜的计算力只能做的很粗糙,一方面消耗颇高,导致国内游戏行业谈性能必谈drawcall数量。
这部分离GPU很近,所以当然要先下手了。
其实早在PS3时代,强劲的spu,一定程度上我们可以理解为是一个更通用的GPGPU,就承担了这个任务,更激进的剔除和替代cpu进行drawcall提交,都让性能在cpu有质的飞跃,gpu也同时受益。
从dx11开始,都支持渲染的对象的部分参数由GPU来生成,可以说GPGPU来做这个事情的条件就也成熟了。
整体上在性能上的收获是非常大的。
从15年的siggraph开始,ubi和EA都相继做了不少的分享:
总的看来,GPU driven pipeline是有两个部分:
==剔除==
这部分是通过gpgpu来先对要渲染的object进行剔除,这里ubi和ea都分成两个level来做,cluster和triangle
=cluster level cull=
把mesh分成固定的一些cluster,比如6400 vertices就分成100个cluster,每个cluster 64vertices,然后进行bound和orientation的cull。
=triangle level cull=
这里的backface,small area triangle都是老生常谈。
depth buffer这个,可以
- 在pc上使用cpu software rasterizer
- depth prepass, 然后downsample
- 使用上一帧的depth buffer做一个reprojection
使用其中的1个或几个组合。
==提交==
这里普遍的遇到项目老代码的问题,如果是dx12或者基于virtual texture的项目会简单些。
简单讲,就是要绑定的资源如果非常不同,还是难以硬放在一起来渲染。
这里< assassin’s creed:unity >就是没法改的彻底,所以还是依据material来batch,那么可以说gpu driven的就相当不彻底。
而redlynx,pipeline是有比较重的virtual texture,farcry5的地形有virtual texture,那么资源就不需要改变绑定,那么就可以一个drawcall搞定一切,达到一个更彻底的gpu driven的程度。
dx12对此有更好的支持,可以更彻底的gpu driven了。
==效率对比==