我想把下面的代码编译成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“存储的缓冲区可能被另一个缓冲区别名有关吗?在调用过程中,可以通过另一个缓冲区修改内容?或者有什么方法可以告诉编译器这是一个“受限”的存储,所以它知道它是常量的?
谢谢
发布于 2022-02-02 02:17:41
现在是凌晨3点,我该去睡觉了。
每个人最终都会遇到同样的问题,但我宁愿自己回答,也不愿删除:
我只需添加一个SpecializationConstant来设置sampler2D数组的大小,现在它可以工作,而不需要任何扩展。
晚安
https://stackoverflow.com/questions/70949572
复制相似问题