如何解决确定输入附件在着色器中是否有效
对于片段着色器,可以将颜色附件索引设置为 VK_ATTACHMENT_UNUSED
(来自 C/C++ API);在这种情况下,对这些附件的写入将被丢弃。这很好,因为它允许我们编写无条件写入输出附件的着色器,并且写入可能会或可能不会被丢弃,这取决于渲染器的决定。
也可以将输入附件索引设置为 VK_ATTACHMENT_UNUSED
,但我们不允许读取此类附件。这意味着如果输入附件可以是VK_ATTACHMENT_UNUSED
,着色器必须知道它是否应该从中读取。
是否有 glsl/spir-v 内置方法来检查输入附件是否绑定到有效的图像视图与指向 VK_ATTACHMENT_UNUSED
?否则,应用程序必须将数据传递给着色器,以确定是否可以读取。这有点痛苦。
一些内置的东西:
layout(input_attachment_index=0,binding=42) uniform subpassInput inputData;
vec4 color = vec4(0);
if (gl_isInputAttachmentValid(0)) {
color = subpassLoad(inputData).rgba
}
解决方法
Vulkan 通常没有便利功能。如果用户完全有能力做一件事,那么如果用户想要完成那件事,Vulkan 不会为他们做。如果您可以提供一个值来指定着色器想要使用的资源是否可用,则 Vulkan 不会为您提供查询。
所以在 Vulkan 中没有这样的查询。但是,您可以很容易地自己构建一个。
在 Vulkan 中,管道是根据特定渲染通道的特定子通道编译的。并且渲染通道的子通道是否使用输入附件是固定到渲染通道的事情。因此,在您的 C++ 代码将着色器模块编译为管道时,它知道子通道是否使用输入附件。它不可能不知道。
因此,您的管道编译代码没有理由不能为您的着色器提供专门化常量来测试它是否应该使用输入附件。只需声明一个特定的特化常量,在着色器中检查它,然后通过 VkPipelineShaderStageCreateInfo::pSpecializationInfo
向管道创建步骤提供特化。
//In shader
layout(constant_id = 0) const bool use_input_attachment;
...
if (use_input_attachment) {
color = subpassLoad(inputData).rgba
}
//In C++
const VkSpecializationMapEntry entries[] =
{
{
0,// constantID
0,// offset
sizeof(VkBool) // size
}
};
const VkBool data[] = { /*VK_TRUE or VK_FALSE,as needed*/ };
const VkSpecializationInfo info =
{
1,// mapEntryCount
entries,// pMapEntries
sizeof(VkBool),// dataSize
data,// pData
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。