【发布时间】:2016-10-04 03:29:37
【问题描述】:
尽管我在尝试创建管道时遇到了问题,但我已经编写了一个小型 Vulkan 测试应用程序来熟悉 Vulkan。
vkCreateGraphicsPipeline 导致验证层产生以下错误: 无效的着色器模块对象 0x8 无效的着色器模块对象 0x9
然后程序在验证层内崩溃。 我为顶点着色器和片段着色器创建了一个 VkShaderModule,并使用 glslangvalidator -V 将它们转换为 vkCreateShaderModule 没有抱怨的 SPIR-V 模块。
有什么我可能错过的吗?这些例子似乎和我做的事情完全一样。
【问题讨论】:
-
您错过了向我们展示实际导致您引用的问题的代码。
-
投反对票是极其不恰当的。在这种情况下,代码不相关,因为只有一种方法可以创建着色器模块并为管道指定它。由于 Vulkan API 的冗长,它也不实用。虽然错误消息本身很模糊,但它可能有一个非常具体的原因,并且毫无疑问其他人以前遇到过它并且应该确切地知道是什么情况导致它。
-
如果这是真的,那么你基本上是假设验证层在某种程度上被破坏了。然而,如果人们根本无法创建图形管道,那么就没有人能够使用验证层。当然,人们正在使用验证层,因此从着色器模块创建图形管道不会出现一般问题。因此,除非有其他理由怀疑,否则我们必须假设您的代码有问题。所以我们需要看看你的代码到底在做什么,不管它有多冗长。
-
没错,就是把手。我不清楚消息指的是什么,并认为可能是句柄所指的对象在某种程度上是无效的,但实际上消息所指的只是句柄本身。原来问题是我应该将 VkShaderModule 容器类的复制构造函数标记为已删除,并且该对象被在 STL 容器中执行的复制隐式销毁。
-
@atlan: "原来问题是我应该将 VkShaderModule 容器类的复制构造函数标记为已删除,并且该对象被在 STL 中执行的复制隐式销毁容器。" 也许现在您会明白为什么在提问时提供minimal reproducible example 很重要。