Glsl 在一个均匀的分支内有一个无约束的采样器

Glsl 在一个均匀的分支内有一个无约束的采样器,glsl,shader,vulkan,Glsl,Shader,Vulkan,假设我有一个像素着色器,有时需要从一个采样器读取,有时需要从两个不同的采样器读取,具体取决于一个统一变量 layout (set = 0, binding = 0) uniform UBO { .... bool useSecondTexture; } ubo; ... void main() { vec3 value0 = texture(sampler1, pos).rgb; vec3 value2 = vec3(0,0,0); if(ubo.useSecond

假设我有一个像素着色器,有时需要从一个采样器读取,有时需要从两个不同的采样器读取,具体取决于一个统一变量

layout (set = 0, binding = 0) uniform UBO {
   ....
   bool useSecondTexture;
} ubo;
...
void main() {
   vec3 value0 = texture(sampler1, pos).rgb;
   vec3 value2 = vec3(0,0,0);
   if(ubo.useSecondTexture) {
       value2 = texture(sampler2, pos).rgb;
   }
   value0 += value2;
} 

做第二个采样器
sampler2
需要绑定到有效的纹理,即使如果
UseCondTexture
false
,所有
vkCmdDraw
vkCmdDispatch
命令都具有以下有效的用法声明,也不会读取该纹理:

如果通过vkCmdBindDescriptorSets指定的每个绑定描述符集中的描述符由当前绑定的VkPipeline对象(通过vkCmdBindPipeline指定)静态使用,则这些描述符必须有效

由于sampler2是静态使用的,所以必须为其提供有效的描述符,否则将得到未定义的行为

我的猜测是,在某些实现中,它将如您所期望的那样工作。但是,允许驱动程序/硬件要求管道可能使用的所有描述符都是有效的,并且要求它们检查内存缓冲区的内容以确定是否可能使用某些东西将非常昂贵