多线程着色通过Vulkan

时间:2017-08-11 09:52:27

标签: multithreading vulkan

我目前正在使用Vulkan中的多线程实现一个基本的延迟渲染器。由于我的G-Buffer应该具有与最终图像相同的分辨率,我希望在具有多个子遍的单个渲染通道中进行,根据this演示,在幻灯片44(第138页)上。它说:

  • vkCmdBeginCommandBuffer
  • vkCmdBeginRenderPass
  • vkCmdExecuteCommands
  • vkCmdNextSubpass
  • vkCmdExecuteCommands
  • vkCmdEndRenderPass
  • vkCmdEndCommandBuffer

我在第一个子传递中得到它,你迭代场景图并为每个实体/网格记录一个辅助命令缓冲区。我没有得到的是如何使用辅助命令缓冲区进行着色传递。你是否以某种方式将屏幕分成几部分并将每个部分渲染到一个单独的线程中,或者只是为整个第二个子传递记录一个辅助命令缓冲区?

2 个答案:

答案 0 :(得分:3)

对我而言,就像你说的那样,你需要多线程化你的命令缓冲区来构建g-buffer subpass"。但是对于着色过程,它必须取决于你是如何做事的。对我(再次),你不需要多线程你的着色子通道。但是,您必须考虑到您可以拥有一个"按地区依赖"。

所以,我鼓励你这样做。 在开始使用RenderPass之前,使用计算着色器在屏幕上绘制所有灯光(这里有一种" quad")。

通过splatting我的意思是这种事情。你有一个点光源(例如),想法是计算受光影响的屏幕空间中的四边形。有了这个,您可以将4个顶点(表示四边形)放入SSBO中,并且可以将其用作着色子通道中的顶点缓冲区。

现在开始渲染过程。

  1. 根据需要MT场景图渲染。并执行你的vkCmdExecuteCommands();
  2. NextSubpass
  3. 使用"四边形阵列"您从早期的计算着色器创建(不要忘记VK_SUBPASS_EXTERNAL依赖)。
  4. NextSubpass等
  5. 然而,你说

      

    迭代场景图并为每个实体/网格记录一个辅助命令缓冲区。

    我不确定我是否真的明白你的意思,但是如果你打算为一个网格设置一个辅助命令缓冲区,我真的建议你改变你的方式。您必须使用批处理。让我们假设您有64000个不同的网格绘制。例如,您可以创建64个命令缓冲区(在4个线程上分派),每个命令缓冲区都有1000个网格绘制。 (这些数字是随机的,因此请对您的应用进行分析。)

    所以为了回答阴影子通道的问题,我不会使用命令缓冲区或只使用很少的(通过灯光(准时,定向))

答案 1 :(得分:2)

  

我不知道如何使用辅助命令缓冲区进行着色传递。

着色过程(可能是第二个子通道)可能会将第一个子通道创建的G缓冲区作为输入附件。然后它将使用来自G-buffers +来自一组灯光的数据(或任何延迟着色器试图推迟的任何内容)绘制到相同大小的屏幕尺寸四边形。

您链接的演示文稿尝试从第13页开始提示此结构样式(标记为" Page 107")。

第一步是让它发挥作用。使用例如这SW example。然后,将其优化为单个renderpass的下一步应该更容易。