我想将以下代码编译成 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”存储的缓冲区可能被另一个缓冲区别名的事实有关,在调用期间可以通过该缓冲区修改内容?或者有没有办法告诉编译器这是一个“受限”存储,所以它知道它是常量?
谢谢