【问题标题】:Render multiple vulkan passes in the same attachment在同一个附件中渲染多个 vulkan 通道
【发布时间】:2021-04-26 06:48:56
【问题描述】:

我想知道是否可以在 Vulkan 中将多个通道渲染到相同颜色和深度的附件中?我需要对一个不适合 GPU 内存的巨大模型进行无头渲染(我正在使用只有 1GB 内存的 Swiftshader)。我想做以下一系列动作:

  1. 初始化一个空的颜色附件和深度缓冲区
  2. 设置着色器和图形管道
  3. 循环遍历我的巨大模型中的顶点块
  4. 将顶点块从 CPU 上传到 GPU
  5. 渲染到颜色和深度缓冲区(在颜色和深度附件中先前值的“顶部”)
  6. 重复下一个块

我目前被困在vkCmdBeginRenderPass() 上,它具有“明确的价值”。但是如果我不想清除缓冲区怎么办。我可以做clearValues = 0吗?还需要什么才能使上述方案发挥作用?

【问题讨论】:

    标签: vulkan


    【解决方案1】:

    渲染通道是否在加载时清除缓冲区是渲染通道设置的一部分。每个附件中都有 loadOp 字段,说明它应该如何使用附件中的任何先前数据(如果有)。

    在您的情况下,因为您不断地将不同的渲染过程累积到相同的图像中,所以您希望 loadOp 加载数据,而不是清除它。您可以在第一次使用vkCmdClearAttachments 执行渲染过程时显式清除附件。

    【讨论】:

    • 谢谢。我设法在渲染过程中使用了vkCmdClearAttachment,它起作用了。但是当我尝试将我的渲染通道分成两个通道时,我在第一通道中清除,并在第二通道中绘制三角形,我得到一个灰色图像,表明第二通道的开始将我的深度缓冲区初始化为未知即使我将loadOp 设置为VK_ATTACHMENT_LOAD_OP_DONT_CARE,也可以使用该值。如果我使用loadOp=VK_ATTACHMENT_LOAD_OP_LOAD,我会得到相同的结果。有什么想法吗?
    • 加载操作应该是加载,而不是“不关心”,因为您非常关心。另外,您是否建立了适当的外部依赖关系,以及图像布局等?
    • 我将loadOp更改为VK_ATTACHEMENT_LOAD_OP_LOAD,将附件描述initialLayout更改为等于第一遍的finalLayout的值。但是,第二个渲染通道仍会清除附件。我将如何设置第一遍和第二遍的依赖关系来做我想做的事?
    • @DovGrobgeld:我无法根据您的一些代码正在做什么的模糊描述来调试代码。
    • 叹息,我意识到在 StackOverflow 中使用 cmets 并不是进行此类讨论的最佳场所。但是,我不确定使用什么论坛会更好。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多