Tiled Based Deferred Rendering与Forward+

Tiled Based流程

 

1.将屏幕分成小块,每个小块为一个视锥体

 

 

2,(depth bounds)在每一个视锥体中,根据ZBuffer得到每个Tile的MinZ和MaxZ,用MinZ到MaxZ这片区域对光做交点测试(使用compute shader)

 

因此不需要光体积,点光源只需要position和range,spotlight也用球来做剔除bound

3.(light culling)剔除后,每个Tile里面的光的index写入list,得到tile个光源index的list

 

4.之后进行color pass

 

Depth Bounds

在每个tile的视锥体里取得maxZ和minZ,需要用到compute shader

每次采样多个深度比一个要节省时间( Parallel Reduction)

 

Light Culling

Advancements in Tiled-Based Compute Rendering里面介绍了两种剔除方法,一种是视锥体剔除,一种是AABB剔除,AABB剔除结果好一些

短视锥体AABB精度更高

 

在深度不连续( Depth Discontinuities)也就是minZMaxZ相距太远导致中间有很多没有照到物体的光源,一般会出现在物体边缘部分(最坏情况是物体边界到farplane),如果计算会浪费,需要被剔除掉,剔除方法文中介绍有2.5D Culling,和halfZ,还有改良halfZ

2.5D Culling

缺点:

先进行上面的lightculling,将视锥体外的光剔除

将minZmaxZ构造的depth bounds分成32份,每份里进行1+light个 Depth mask & Depth mask

之所以是32份是因为用一个32bit的Depth mask

首先把物体写入一个Depth mask,32块,如果有一块里包含物体,就为1否则为0

再对每个光写入Depth mask,与物体的Depth mask进行&操作,这样就知道光是否照到物体,而且知道照到哪块物体了,,可以剔除掉中间没有用的光源了

 

 

优化与测试

得出结论改良HalfZ和AABB是最性能最好的

并且可以把块变小,用16x16与32x32作对比,32x32虽然会增加colornpass消耗,但是会减少culling时间,整体还是比16x16时间短

 

 

Tiled Based Deferred Rendering

Tiled Based Deferred Rendering流程

1.生成GBuffer

2.将GBuffer分tile,每个tile用cs计算出depth bound

3.进行light cull,得到light index list

4.color pass,使用GBuffer信息,用该fragment所在tile的light index list进行绘制

 

TBDR好处

传统Deferred每一个光照要绘制整个光照体积,光源多了也很消耗,

TBDR通过分块与光源进行求交测试,不需要像传统Deferred一样绘制光体积还要深度测试和stencil pass了

 

Forward+

 

Forward+流程

1.ZPrePass(为了获取深度进行depth bound,但是ZPrePass也会辅助硬件进行earlyZ)

2.将ZBuffer分tile,每个tile用cs计算出depth bound

3. 进行light cull,得到light index list

4.同forward一样,。每个物体走FS,用该fragment所在tile的light index list进行绘制

 

Forward+好处

可以用多个光源,不必再多一个光源就要全部绘制一遍,在光源照不到的部分就不需要绘制

需要ZPrePass来提前生成ZBuffer,比Deferred带宽要少,

Forward+比传统Deferred要快

详细性能分析请看龚大这篇文章

 

参考:


1. Forward+: Bringing DeferredLighting to the Next Level

2. A 2.5D Culling for Forward+

3. Advancements in Tiled-Based Compute Rendering

4.Forward框架的逆袭:解析Forward+渲染

 

----by wolf96 2019/1/1

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章