[英]Is it OK to read from an input attachment and write to the same attachment in the same drawcall?
[英]Determine if input attachment is valid within shader
對於片段着色器,可以將顏色附件索引設置為VK_ATTACHMENT_UNUSED
(來自 C/C++ API); 在這種情況下,對這些附件的寫入將被丟棄。 這很好,因為它允許我們編寫無條件寫入 output 附件的着色器,並且寫入可能會或可能不會被丟棄,具體取決於渲染器的決定。
也可以將輸入附件索引設置為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
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.