为 Vulkan 自动编译 OpenGL 着色器

me'*_*me' 5 opengl glsl vulkan spir-v

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

'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan
Run Code Online (Sandbox Code Playgroud)

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

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

[--glsl-emit-push-constant-as-ubo]
[--glsl-emit-ubo-as-plain-uniforms]
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 6

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

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