我一直在检查 LunarG 样本中的drawsubpasses 样本(文件:API-Samples/drawsubpasses/drawsubpasses.cpp)。
在这个例子中,当第一个 vkCmdDraw() 被调用时,活动子通道没有颜色附件,只有深度/模板附件。使用的片段着色器确实有一个输出变量。
阅读规范并不能帮助我理解这种用法是否“安全”,或者驱动程序将如何处理它。
我一直在检查 LunarG 样本中的drawsubpasses 样本(文件:API-Samples/drawsubpasses/drawsubpasses.cpp)。
在这个例子中,当第一个 vkCmdDraw() 被调用时,活动子通道没有颜色附件,只有深度/模板附件。使用的片段着色器确实有一个输出变量。
阅读规范并不能帮助我理解这种用法是否“安全”,或者驱动程序将如何处理它。
Vulkan 1.0.16 似乎已经纠正了这一点。它明确表示不会对大于子通道attachmentCount
或已明确声明的附件索引执行任何写入VK_ATTACHMENT_UNUSED
。根据当前子通道的描述,输出变量将是未定义的,但不会写入任何内容。
这是一个很好的问题。我花了几分钟在预期的地方阅读规范,但是没有语言解释当片段着色器写入子通道中没有附件的输出位置时会发生什么。它应该在第 14.3 节中指定,但没有任何内容。
您可能需要提交 Vulkan 规范错误报告。
我假设正确的行为与 OpenGL 相同:有效地忽略此类输出。