[Vulkan] Forward+ 和 TBDR

  • 时间:
  • 来源:互联网
  • 文章标签:

前言

在 Vulkan 渲染器中集成了F+ 和 TBDR
主要时间花在了材质和管线设计上,然而还是一坨屎,想重构,感觉我快搞不下去了
本文主要是两个渲染路径的流程和一些细节

正文

【Forward+ Rendering】

说实话,个人感觉f+并没有那么屌:

  1. 聚光灯和视椎体的碰撞仍然用球,会有漏网之鱼(当然有点杠,f+漏网之鱼多了去了);
  2. 需要DepthPrePass,没有clip的物体只需要vert shader还好点,clip的还需要frag shader;
  3. CS LightCulling耗时;

优点也有,和TBDR比有带宽优势

理论

Forward+: Bringing Deferred Lighting to the Next Level

参考

没错,这也是抄抄改改

https://github.com/WindyDarian/Vulkan-Forward-Plus-Renderer

在Vulkan中

1. Depth PrePass

  1. 创建两个Graphics Pipeline,一个只绑vert,另一个绑vert 和 frag 分别用于没有clip和使用clip的材质
  2. 根据Bounding Box中心位置从近到远绘制网格到Depth Buffer

2. Light Culling Pass

  1. 创建LightCulling描述集,绑定光源信息、视椎体信息的UBO,绑定到管线
  2. 创建一个Compute Pipeline,绑定Light Culling Compute Shader,Push Tile Size 和 屏幕分辨率
  3. 创建LightCullingCB,绑定栅栏和UBO。

3. DrawFrame Loop中

  1. 等待Depth PrePass绘制完成的信号量
  2. 更新所有光源的信息
  3. 计算队列执行 Light Culling
  4. 设栅栏等Light Culling结束,将Light Culling的结果给用于着色的Graphics Pipeline,需要额外绑DynUBO存当前Tile ID
  5. 着色单Pass走循环计算所有光照

4. Light Culling Compute Shader

  1. 计算当前Tile Id 和 Tile Index
  2. 仅在(gl_LocalInvocationIndex == 0)时遍历当前Tile的所有像素,获取min_depth和max_depth,并创建视椎体
  3. barrier() // 等待计算完成
  4. 仅在(gl_LocalInvocationIndex == 0)时遍历所有光源,检测是否与视椎体碰撞,或者在视椎体范围内,如果是,加入光源索引到当前Tile的光源数组
  5. barrier()
  6. 记录当前Tile的可见光总数量

【Tile-Based Deferred Rendering】

理论

延迟渲染(Deferred Rendering)的前生今世
总结怪NB

参考

码完F+,TBDR几乎已经可以直接码了;
《Vulkan应用开发指南》最后一章演示多通道渲染,顺带把延迟渲染的子通道和依赖那一坨印书上了。。。只需要把Compute Pipline和CS补上,我直接改了改F+的。

https://github.com/SaschaWillems/VulkanSponza

操作上F+的不同之处

  • 没有用Depth PrePass,而是在GBuffer Pass的 vkCmdEndRenderPass之后,用Buffer里的世界坐标替代了F+ CS里的深度
  • sub pass依赖和渲染顺序:深度 → G缓冲 → 光照 → 半透明 → 合成

阶段总结

  • 这个渲染器添加新的Shader仍然要继承PiplineBase创建新pipline类、重写函数(如果Pass相同,只是Shader参数改改不用)
  • 没有UI
  • 视锥剔除和LOD在Willems的Vulkan教程里有案例,TAA 、SSGI、 SSAO 也是抄的。
  • 可以开始叠加其他效果,但我不想搞了,结构没搞好,写着难受,也不想再花时间。如果最开始的时候定义它为“PBR渲染器”之类的单一/固定材质渲染器,就简单多了。。
  • 本来想把代码丢Git上,但是写的太垃圾了,这坨代码连我自己都能恶心到;这次我深刻体会到了架构设计的重要性。

这个渲染器的状况就是:可以增加新Shading Model,但是有些麻烦;如果说它只支持单一材质,又有一堆没用的代码

未来

  • 最近两个月不打算再搞这个渲染器,以后要搞得话,我tm直接删了重写;
  • 开始学习Houdini;

本文链接http://www.taodudu.cc/news/show-1781903.html