Skip to content

Tiled based rendering

nujuxtsun edited this page Jul 7, 2019 · 5 revisions

颜色越亮代表接受的光源越多,可以看到边缘部分比其他部分都亮

基本流程

pass 1: 绘制gbuffer或者pre z 得到depth信息

pass 2: 按照划分好的tile 对每个tile根据depthbuffer获得最大深度最小深度

pass 3: 根据得到的最大最小深度计算tile的frustum范围,然后根据这个范围剔除光源

pass 4: 对每个像素找到他对应的tile,然后根据剔除后的光源做光照

实现中的问题

  1. 实现中,frustum和光源求交时,使用的是frustum的AABB,虽然精确度差了些,不过求交效率自然没什么问题

  2. frustum在Z轴上可以考虑使用half z的方法分成两段frustum, 这种方法可以大大减少z值不连续导致边缘frustum范围过大, 效果大多数情况下不比clustered差.

  3. tiled 比 clustered 有个优点就是可以在平面上分的更细, clustered由于z轴上有划分导致内存占用非常高

  4. 因为tbr求frustum的时候需要最大最小深度, 所以如果使用的是前向渲染,需要depth pre-pass, 延迟渲染只需要用gbuffer结果就好了

  5. 具体优化时,可以考虑把光照计算(pass4)直接移到对光源裁剪的compute shader里(pass3),在裁剪结束后立刻对像素进行光照计算

  6. 光源信息的保存用Buffer, 具体做法参考下面贴出的参考文章.大体描述就是, 一个索引buffer, 一个光源buffer, 索引记录着每个tile在光源buffer中光源信息的位置, 然后在光源buffer中类似网络消息处理粘包的方法, 头部是当前tile受影响的光源数量,后面接着光源的索引.最终靠索引从光源信息buffer中找到光源信息

参考

. 再也找不到比这个更详细的文章了 https://www.3dgep.com/forward-plus/ 几乎是手把手的教你怎么写一个tbr,可惜我写完了以后才看到这篇文章

Clone this wiki locally