5

有没有办法为 Vulkan 自动编译 OpenGL 着色器?问题出在制服上。

'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan

我尝试过为 OpenGL 编译,然后用 spirv-cross 反编译--vulkan-semantics,但它仍然有非透明的制服。

spirv-cross 似乎只有为 OpenGL 编译 Vulkan 着色器的工具。

[--glsl-emit-push-constant-as-ubo]
[--glsl-emit-ubo-as-plain-uniforms]
4

1 回答 1

6

用于 OpenGL 的着色器在 Vulkan 上不起作用。即使忽略他们对制服的看法的差异,他们也有非常不同的资源模型。Vulkan 使用描述符集和绑定点,所有资源都使用相同的绑定索引(set+binding)。相比之下,OpenGL 为每种资源提供了自己独特的索引集。因此,用于 OpenGL 消耗的 GLSL 着色器可能会将纹理统一和统一块分配给相同的绑定索引。但是您不能在用于 Vulkan 的 GLSL 着色器中执行此操作,除非这两个资源位于不同的描述符集中。

如果您想共享着色器,您将需要使用预处理器技巧来确保着色器为正在编译着色器的特定目标分配资源(包括它如何分配制服)。

于 2019-11-23T22:38:32.007 回答