1

对于片段着色器,可以将颜色附件索引设置为VK_ATTACHMENT_UNUSED(来自 C/C++ API);在这种情况下,对这些附件的写入将被丢弃。这很好,因为它允许我们编写无条件写入输出附件的着色器,并且写入可能会或可能不会被丢弃,具体取决于渲染器的决定。

也可以将输入附件索引设置为VK_ATTACHMENT_UNUSED,但我们不允许从此类附件中读取。这意味着如果输入附件可以VK_ATTACHMENT_UNUSED,着色器必须知道它是否应该从中读取。

是否有 glsl/spir-v 内置方法来检查输入附件是否绑定到有效的图像视图 vs 指向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
} 
4

1 回答 1

2

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
};
于 2021-05-29T01:20:06.120 回答