2017-10-19 218 views
1

我使用包含多個子通道的Vulkan進行了渲染通道。我們可以假設它有2個子通道,子通道A和B.在子通道A中,我渲染到一個圖像,我想在子通道B中用作組合圖像採樣器(即,不作爲輸入附件)。我的問題是,我應該如何進行從VK_IMAGE_LAYOUT_COLOR_ATTACHMENT到VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL的圖像轉換?Vulkan渲染通道內的圖像佈局轉換API

我認爲subpass依賴機制本身並不好,因爲我不使用subpass B中的圖像作爲附件(我猜這是無意義的使用它作爲輸入,顏色或保留)我想用自我依賴的簡單圖像障礙,當驗證層告訴我如果在渲染過程中使用圖像障礙時,新舊佈局字段應該是相同的!

此圖像佈局轉換模式對我來說似乎很自然,但我還沒有找到任何解決方案。也許我誤解了子路徑和渲染路徑的概念,我應該爲A和B使用不同的渲染路徑? (雖然在這種情況下,我將不得不在兩次渲染過程中處理我的G緩衝區,但我無法使用Vulkan的「輸入附着機制」。)

回答

3

渲染通道(和子通道)設計用於子通道A寫入相同的子通道B以便稍後讀取的(x, y, layer)像素的情況。它不適用於從圖像進行隨機訪問。

正如您所注意到的,所有附件只能以這種方式訪問​​圖像。 然後有pPreserveAttachments。如果你在那裏包括你的形象,你不允許觸摸它;如果你不這樣做,那麼圖像將變得不確定。將附件想象成不存儲在任何地方的東西(即僅存在於高速緩衝存儲器中)可能會更好。您必須將附件複製/存儲到非附件映像以使其以這種方式可用。

要從福爾康說明書引述如下:用作附件必須不能以任何其他方式用於渲染過程實例的持續時間訪問

圖片子資源。

和您的圖片附件。您將它用作子通道A中的顏色附件(因此它必須是)。這就是說,你可能需要兩個單獨的渲染通道(或者使用輸入附件功能,如果可能的話,你的類型的問題,如@AntoineMorrier建議)。特別是如果沒有其他圖像具有如上所述的優化依賴性。

+0

謝謝。正如我所說,我無法用輸入附件解決這個問題(雖然它們非常有用,我在渲染器中使用它們很多),所以我會重新設計我的通行證。 – Sandor

-1

當您創建渲染通道和子通道,你必須使用此結構:

typedef struct VkAttachmentReference { 
    uint32_t   attachment; 
    VkImageLayout layout; 
} VkAttachmentReference; 

在全球範圍內,這種結構說,在你的subpass的開始,你的形象會在指定的佈局。因此,假設您想要在子通道0中使用佈局COLOR_ATTACHMENT,在子通道1中使用INPUT_ATTACHMENT(優先於SHADER_READ),您只需指定每個子通道描述的佈局,並且必須聲明一個子通道依賴項子通道0和子通道1之間。

+0

如果我們想從前一個渲染通道的子通道中的顏色/深度附件中讀取圖像,我們只能通過輸入附件來完成。所以並不是說我們可以比其他佈局更喜歡INPUT_ATTACHMENT佈局。我們必須使用它。但除此之外,我同意。 – Ekzuzy