-
Notifications
You must be signed in to change notification settings - Fork 6
Tiled based rendering
颜色越亮代表接受的光源越多,可以看到边缘部分比其他部分都亮
pass 1: 绘制gbuffer或者pre z 得到depth信息
pass 2: 按照划分好的tile 对每个tile根据depthbuffer获得最大深度最小深度
pass 3: 根据得到的最大最小深度计算tile的frustum范围,然后根据这个范围剔除光源
pass 4: 对每个像素找到他对应的tile,然后根据剔除后的光源做光照
-
实现中,frustum和光源求交时,使用的是frustum的AABB,虽然精确度差了些,不过求交效率自然没什么问题
-
frustum在Z轴上可以考虑使用half z的方法分成两段frustum, 这种方法可以大大减少z值不连续导致边缘frustum范围过大, 效果大多数情况下不比clustered差.
-
tiled 比 clustered 有个优点就是可以在平面上分的更细, clustered由于z轴上有划分导致内存占用非常高
-
因为tbr求frustum的时候需要最大最小深度, 所以如果使用的是前向渲染,需要depth pre-pass, 延迟渲染只需要用gbuffer结果就好了
-
具体优化时,可以考虑把光照计算(pass4)直接移到对光源裁剪的compute shader里(pass3),在裁剪结束后立刻对像素进行光照计算
-
光源信息的保存用Buffer, 具体做法参考下面贴出的参考文章.大体描述就是, 一个索引buffer, 一个光源buffer, 索引记录着每个tile在光源buffer中光源信息的位置, 然后在光源buffer中类似网络消息处理粘包的方法, 头部是当前tile受影响的光源数量,后面接着光源的索引.最终靠索引从光源信息buffer中找到光源信息
. 再也找不到比这个更详细的文章了 https://www.3dgep.com/forward-plus/ 几乎是手把手的教你怎么写一个tbr,可惜我写完了以后才看到这篇文章