我正在关注https://vulkan-tutorial.com/ 上的 vulkan 教程和深度缓冲章节,作者 Alexander Overvoorde 提到“我们只需要一个深度图像,因为一次只运行一个绘制操作。” 这就是我的问题所在。
在过去的几天里,我阅读了许多关于 Vulkan 同步的 SO 问题和文章/博客文章,但我似乎无法得出结论。到目前为止,我收集到的信息如下:
在 gpu 上执行相同子通道中的绘制调用,就好像它们按顺序执行一样,但前提是它们绘制到帧缓冲区(我不记得我在哪里读到的,这可能是 youtube 上的技术演讲,所以我是对此不是 100% 确定)。据我了解,这更多是 GPU 硬件行为,而不是 Vulkan 行为,因此这基本上意味着上述情况总体上是正确的(包括跨子通道甚至渲染通道)——这将回答我的问题,但我不能没有找到任何明确的信息。
我最接近回答我的问题的是OP 似乎接受的这个reddit 评论,但理由基于两件事:
“在高层有一个队列刷新,确保之前提交的渲染通道完成”
“渲染通道本身描述了它们作为外部依赖读取和写入的附件”
我既没有看到任何高级队列刷新(除非在规范中我一生都找不到某种明确的队列),也没有看到渲染通道描述对其附件的依赖关系的地方 - 它描述了附件,但没有描述依赖项(至少不是明确的)。说明书的相关章节我看了很多遍,但感觉语言不够清晰,初学者无法完全掌握。
如果可能,我也非常感谢 Vulkan 规范引用。
编辑:澄清一下,最后一个问题是:什么同步机制保证在当前绘制调用完成之前不提交下一个命令缓冲区中的绘制调用?