Multithreading 多线程着色过程

Multithreading 多线程着色过程,multithreading,vulkan,Multithreading,Vulkan,我目前正在Vulkan中使用多线程实现一个基本的延迟渲染器。根据幻灯片44(第138页)上的演示,由于我的G缓冲区应具有与最终图像相同的分辨率,我希望在一次渲染过程中使用多个子过程来完成此操作。它说: vkCmdBeginCommandBuffer vkCmdBeginRenderPass vkCmdExecuteCommands vkCmdNextSubpass vkCmdExecuteCommands vkCmdEndRenderPass vkCmdEndCommandBuffer 在第

我目前正在Vulkan中使用多线程实现一个基本的延迟渲染器。根据幻灯片44(第138页)上的演示,由于我的G缓冲区应具有与最终图像相同的分辨率,我希望在一次渲染过程中使用多个子过程来完成此操作。它说:

  • vkCmdBeginCommandBuffer
  • vkCmdBeginRenderPass
  • vkCmdExecuteCommands
  • vkCmdNextSubpass
  • vkCmdExecuteCommands
  • vkCmdEndRenderPass
  • vkCmdEndCommandBuffer
在第一个子过程中,迭代场景图并为每个实体/网格记录一个次要commandbuffer。我不明白的是如何使用辅助命令缓冲区执行着色过程。您是将屏幕分成多个部分,并在单独的线程中渲染每个部分,还是只为整个第二个子过程记录一个辅助commandbuffer

我不明白的是如何使用辅助命令缓冲区执行着色过程

着色过程(假定为第二个子过程)可能将第一个子过程创建的G缓冲区作为输入附件。然后,它将使用一组灯光(或延迟着色器尝试延迟的任何灯光)的G-buffers+中的数据绘制出大小相等的屏幕大小四边形

您链接的演示文稿试图从第13页(标记为“第107页”)开始提示这种结构样式

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

我不明白的是如何使用辅助命令缓冲区执行着色过程

着色过程(假定为第二个子过程)可能将第一个子过程创建的G缓冲区作为输入附件。然后,它将使用一组灯光(或延迟着色器尝试延迟的任何灯光)的G-buffers+中的数据绘制出大小相等的屏幕大小四边形

您链接的演示文稿试图从第13页(标记为“第107页”)开始提示这种结构样式


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

对我来说,就像你说的,你可以为“构建g-buffer子类”使用多线程命令缓冲区。但是,对于着色过程,它必须取决于您如何操作。对我来说(再次),您不需要多线程着色子类。但是,您必须考虑到您可以有一个“按区域依赖关系”

所以,我鼓励你这样做。 在开始渲染过程之前,请使用计算着色器在屏幕上显示所有灯光(这里有一种“四边形”数组)

我指的是这种东西。如果有一个点光源(例如),其想法是计算受光源影响的屏幕空间中的四边形。这样,您就有4个顶点(表示一个四边形)放在SSBO中,可以将其用作着色子过程中的顶点缓冲区

现在开始渲染过程

  • 如果需要,请执行场景图渲染。并执行vkCmdExecuteCommands()
  • 下一步
  • 使用从早期计算着色器创建的“四边形数组”(不要忘记VK_子类_外部依赖项)
  • 下一节课等等
  • 但是你说

    迭代场景图并为每个实体/网格记录一个辅助commandbuffer

    我不确定我是否真的理解您的意思,但如果您打算为一个网格使用一个辅助命令缓冲区,我真的建议您更改您的操作方式。必须使用批处理。假设要绘制64000个不同的网格。例如,可以创建64个命令缓冲区(在4个线程上调度),每个命令缓冲区有1000个网格要绘制。(数字是随机抽取的,因此请简要说明您的应用程序)


    因此,为了回答您关于着色子类的问题,我不会使用命令缓冲区,或者只使用很少的命令缓冲区(通过灯光(准时、定向))

    对我来说,就像您所说的,您可以为“building g-buffer子类”使用多线程命令缓冲区。但是,对于着色过程,它必须取决于您如何操作。对我来说(再次),您不需要多线程着色子类。但是,您必须考虑到您可以有一个“按区域依赖关系”

    所以,我鼓励你这样做。 在开始渲染过程之前,请使用计算着色器在屏幕上显示所有灯光(这里有一种“四边形”数组)

    我指的是这种东西。如果有一个点光源(例如),其想法是计算受光源影响的屏幕空间中的四边形。这样,您就有4个顶点(表示一个四边形)放在SSBO中,可以将其用作着色子过程中的顶点缓冲区

    现在开始渲染过程

  • 如果需要,请执行场景图渲染。并执行vkCmdExecuteCommands()
  • 下一步
  • 使用从早期计算着色器创建的“四边形数组”(不要忘记VK_子类_外部依赖项)
  • 下一节课等等
  • 但是你说

    迭代场景图并为每个实体/网格记录一个辅助commandbuffer

    我不确定我是否真的理解您的意思,但如果您打算为一个网格使用一个辅助命令缓冲区,我真的建议您更改您的操作方式。必须使用批处理。假设要绘制64000个不同的网格。例如,可以创建64个命令缓冲区(在4个线程上调度),每个命令缓冲区有1000个网格要绘制。(数字是随机抽取的,因此请简要说明您的应用程序)


    因此,为了回答您关于着色子类的问题,我不会使用命令缓冲区,也不会使用很少的缓冲区(通过灯光类型(准时、定向))

    我不太理解您所说的“全部拆分”是什么意思