0

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

谢谢

4

1 回答 1

1

这里是凌晨三点,我该睡觉了。
任何人最终遇到相同问题的机会都很小,但我仍然宁愿自己回答而不是删除它:
我只需要添加一个 SpecializationConstant 来设置 sampler2D 数组的大小,现在它不需要任何扩展即可工作。
晚安

于 2022-02-02T02:17:41.893 回答