假设我有像素着色器,有时需要从一个采样器读取,有时需要从两个不同的采样器读取,具体取决于统一变量
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
需要绑定到有效纹理,即使useSecondTexture
为false
时也不会读取纹理。
答案 0 :(得分:2)
所有vkCmdDraw
和vkCmdDispatch
命令都有此Valid Usage语句:
通过vkCmdBindDescriptorSets指定的每个绑定描述符集中的描述符必须有效,如果它们由当前绑定的VkPipeline对象静态使用,通过vkCmdBindPipeline指定
由于sampler2是静态使用的,因此您必须拥有一个有效的描述符,否则您将获得未定义的行为。
我的猜测是,在某些实现中,它会按预期工作。但是允许驱动程序/硬件要求管道可能使用的所有描述符都是有效的,并要求它们检查内存缓冲区的内容以确定是否可能使用某些内容将非常昂贵。