我什么时候需要 GL_EXT_nonuniform_qualifier?

when do i need GL_EXT_nonuniform_qualifier?


我想将以下代码编译成 SPIR-V
#version 450 core
#define BATCH_ID (PushConstants.Indices.x >> 16)
#define MATERIAL_ID (PushConstants.Indices.x & 0xFFFF)

layout (push_constant) uniform constants {
    ivec2 Indices;
} PushConstants;

layout (constant_id = 1) const int MATERIAL_SIZE = 32;

in Vertex_Fragment {
    layout(location = 0) vec4 VertexColor;
    layout(location = 1) vec2 TexCoord;
} inData;

struct ParameterFrequence_3 {
    int ColorMap;
};
layout (set = 3, binding = 0, std140) uniform ParameterFrequence_3 {
    ParameterFrequence_3[MATERIAL_SIZE] data;
} Frequence_3;

layout (location = 0) out vec4 out_Color;

layout (set = 2, binding = 0) uniform sampler2D[] Sampler2DResources;


void main(void) {
    vec4 color = vec4(1.0);
    color *= texture(Sampler2DResources[Frequence_3.data[MATERIAL_ID].ColorMap], inData.TexCoord);
    color *= inData.VertexColor;
    out_Color = color;
}

(代码是我开发的程序生成的,所以代码看起来可能有点奇怪,但应该能说明问题)
尝试这样做时,我被告知

error: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier

(对于也发生纹理查找的倒数第三行)
在我关注了很多关于如何指定动态统一的讨论之后,着色语言规范基本上说范围是由 API 指定的,而 OpenGL 和 Vulkan 都没有真正这样做(也许改变了),我很困惑为什么我收到那个错误。
最初我想为索引使用实例化的顶点属性,但是这些属性并不是动态统一的,这正是我认为 PushConstants 应该是的。
因此,当 PushConstants 在绘制调用期间保持不变时(这是动态统一要求的最大范围),上述着色器如何以任何动态非统一状态结束?

编辑:这是否与支持“ColorMap”存储的缓冲区可能被另一个缓冲区别名有关,在调用期间可能通过该缓冲区修改内容?或者有没有办法告诉编译器这是一个“受限”存储,所以它知道它是常量?

谢谢

这边凌晨3点了,该睡觉了
任何人最终遇到同样问题的可能性很小,但我还是宁愿自己回答也不愿删除它:
我只需要添加一个 SpecializationConstant 来设置 sampler2D 数组的大小,现在它不需要任何扩展就可以工作了。
晚安