在彼此之上绘制场景的最佳方式
Optimal way to drawing scenes on top of each others
我试图在彼此之上绘制场景,我在 OpenGL 中的做法是绘制每个场景,然后清除深度模板,然后绘制下一个场景。
对于Vulkan世界,如果我们想翻译我以前的方式,我必须开始渲染通道然后绘制每个场景然后清除深度模板(vkCmdClearAttachments ) 然后绘制下一个场景并结束渲染过程。但是我想到了几个问题:
- 有什么更好的策略吗? (例如,为每个场景启动新渲染通道。)
- 我找到了
vkCmdClearAttachments
但我不确定它是否需要与上一个和下一个命令同步?
无论是在 Vulkan 还是 OpenGL 中,"optimal" 执行此操作的方法是将深度缓冲区划分为两个区域:每个场景一个。您使用 viewport transform 对深度缓冲区进行分区。一个场景将获得 [0.5, 1] 范围,而下一个场景将获得 [0, 0.5] 范围。 glDepthRange
是您在 OpenGL 中用来设置它的内容,VkViewport
的 min/maxDepth
字段处理 Vulkan 中的类似转换。
如果由于某种原因你不能划分你的深度缓冲区(可能是因为这两个场景都需要近距离小浮点值的额外精度),那么哪种选择更优几乎肯定取决于底层硬件。在基于图块的渲染器上,就性能而言,我认为 vkCmdClearAttachments
不是好消息。但是对于传统的渲染器来说,如此清晰的调用几乎不是性能问题,而必须开始一个新的渲染通道的成本将是您将使用的主要内容。
我试图在彼此之上绘制场景,我在 OpenGL 中的做法是绘制每个场景,然后清除深度模板,然后绘制下一个场景。
对于Vulkan世界,如果我们想翻译我以前的方式,我必须开始渲染通道然后绘制每个场景然后清除深度模板(vkCmdClearAttachments ) 然后绘制下一个场景并结束渲染过程。但是我想到了几个问题:
- 有什么更好的策略吗? (例如,为每个场景启动新渲染通道。)
- 我找到了
vkCmdClearAttachments
但我不确定它是否需要与上一个和下一个命令同步?
无论是在 Vulkan 还是 OpenGL 中,"optimal" 执行此操作的方法是将深度缓冲区划分为两个区域:每个场景一个。您使用 viewport transform 对深度缓冲区进行分区。一个场景将获得 [0.5, 1] 范围,而下一个场景将获得 [0, 0.5] 范围。 glDepthRange
是您在 OpenGL 中用来设置它的内容,VkViewport
的 min/maxDepth
字段处理 Vulkan 中的类似转换。
如果由于某种原因你不能划分你的深度缓冲区(可能是因为这两个场景都需要近距离小浮点值的额外精度),那么哪种选择更优几乎肯定取决于底层硬件。在基于图块的渲染器上,就性能而言,我认为 vkCmdClearAttachments
不是好消息。但是对于传统的渲染器来说,如此清晰的调用几乎不是性能问题,而必须开始一个新的渲染通道的成本将是您将使用的主要内容。