在统一分支内有一个非绑定采样器
Having a non bound sampler inside an uniform branch
假设我有像素着色器,有时需要从一个采样器读取,有时需要从两个不同的采样器读取,具体取决于统一变量
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
,则纹理不会被读取。
所有 vkCmdDraw
和 vkCmdDispatch
命令都具有以下有效用法声明:
Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline
由于 sampler2 是静态使用的,因此您必须有一个有效的描述符,否则您将得到未定义的行为。
我的猜测是,在某些实现中,它会像您预期的那样工作。但是 drivers/hardware 被允许要求管道可能使用的所有描述符都是有效的,并且要求它们检查内存缓冲区的内容以确定是否可以使用某些东西会非常昂贵。
假设我有像素着色器,有时需要从一个采样器读取,有时需要从两个不同的采样器读取,具体取决于统一变量
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
,则纹理不会被读取。
所有 vkCmdDraw
和 vkCmdDispatch
命令都具有以下有效用法声明:
Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline
由于 sampler2 是静态使用的,因此您必须有一个有效的描述符,否则您将得到未定义的行为。
我的猜测是,在某些实现中,它会像您预期的那样工作。但是 drivers/hardware 被允许要求管道可能使用的所有描述符都是有效的,并且要求它们检查内存缓冲区的内容以确定是否可以使用某些东西会非常昂贵。