0

我有一个 Vulkan 应用程序,其中着色器作为 GLSL 提供,并根据 GL_KHR_vulkan_glsl 规范使用 spirv cross 编译。我尝试通过 push_constant 块向着色器提供数据。然而,问题是如果没有布局/偏移限定符,顶点和片段阶段中的块似乎重叠。当然,我可以在片段阶段分配块,例如偏移 64,并将顶点阶段限制为该值。但是,如果顶点着色器需要超过 64 个字节并且我的 push_constant 空间非常有限(128 个字节),那么这是不灵活的。我的 GLSL 着色器是自动生成的。当然,我可以让生成器生成偏移量,但是我必须在片段着色器编译之前根据 std140/std430 计算顶点着色器 push_constant 的使用情况,这是我不习惯的。

首先,我尝试将来自顶点和片段阶段的推送常量组合到一个块中,该块在顶点和片段阶段都声明。但是,顶点阶段似乎优化了仅由片段阶段使用的推送常量,反之亦然,我得到一个 UNASSIGNED-CoreValidation-Shader-PushConstantOutOfRange 错误。

您能否向我推荐一种方法,如何避免顶点和片段着色器 push_const 块之间的重叠,同时仍以最佳方式共享 128 字节空间?

问候

4

0 回答 0