2016-11-06 68 views
0

我執行我的DepthBuffer作爲輔助子通道的InputAttachment時遇到了一些麻煩。我想使用我的第一個子通道的深度信息。我怎樣才能實現這一點?看來,我當前的代碼給了我只是一個空的緩衝區..如何在Vulkan中使用DepthBuffer作爲InputAttachment?

我的深度緩存的設置如下:

create_info.imageType  = VK_IMAGE_TYPE_2D; 
create_info.format   = VK_FORMAT_D32_SFLOAT; 
create_info.mipLevels  = 1; 
create_info.arrayLayers  = 1; 
create_info.samples   = VK_SAMPLE_COUNT_1_BIT; 
create_info.tiling   = VK_IMAGE_TILING_OPTIMAL; 
create_info.usage   = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; 

然後我用下面的佈局轉變:

VkImageMemoryBarrier layout_transition_barrier{}; 
{ 
    barrier.sType     = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; 
    barrier.srcAccessMask   = 0; 
    barrier.dstAccessMask   = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT 
            | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; 
    barrier.oldLayout    = VK_IMAGE_LAYOUT_UNDEFINED; 
    barrier.newLayout    = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; 
    barrier.srcQueueFamilyIndex  = VK_QUEUE_FAMILY_IGNORED; 
    barrier.dstQueueFamilyIndex  = VK_QUEUE_FAMILY_IGNORED; 
    barrier.image     = image; 
    barrier.subresourceRange  = { VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1 }; 
} 

該作品完全適用於渲染。 我使用的VkAttachmentReference具有佈局VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,我將它用作VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
在我的片段着色器中,我使用layout (set = 0, binding = 1) uniform sampler2D inputDepth;來訪問它,但沒有任何成功..我得到的信息只是任何顏色通道的零。


而且我用這種依賴性:

VkSubpassDependency dependency{}; 
{ 
    dependency.srcStageMask  = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; 
    dependency.dstStageMask  = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; 
    dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT 
           | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; 
    dependency.dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; 
    dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; 
} 

這descritpion

static VkAttachmentDescription depth_input_attachment{}; 
{ 
    depth_input_attachment.format   = VK_FORMAT_D32_SFLOAT; 
    depth_input_attachment.samples   = VK_SAMPLE_COUNT_1_BIT; 
    depth_input_attachment.loadOp   = VK_ATTACHMENT_LOAD_OP_LOAD; 
    depth_input_attachment.storeOp   = VK_ATTACHMENT_STORE_OP_DONT_CARE; 
    depth_input_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; 
    depth_input_attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; 
    depth_input_attachment.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; 
    depth_input_attachment.finalLayout  = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; 
} 
+1

那麼......你目前的代碼是什麼? –

+0

剛剛添加了我的代碼優秀:) – ToxiCore

+0

這裏似乎有一些缺少的代碼。例如,您的佈局障礙表示圖像處於ATTACHMENT_OPTIMAL佈局。但是你說'VkAttachmentReference'指定了READ_ONLY_OPTIMAL佈局。因此,無論是您沒有告訴我們的佈局轉換,還是您對Vulkan的說謊以及您應該使用的Vulkan驗證層都應該捕捉到這些錯誤。 –

回答

2

如果你正在做subpasses(而不是多重渲染通道),並希望使用您的深度緩衝作爲inputAttachment並且想要使用附件作爲第二個輸入sub pass,

layout (set = 0, binding = 1) uniform sampler2D inputDepth

是不正確的語法與在着色器採樣。從輸入附件

採樣需要一種特殊的語法:

layout (input_attachment_index = n, binding = m) uniform subpassInput inputDepth;

這也需要VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT代替VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER類型的描述符。請注意,輸入附件的實際描述符不需要採樣器。

如果您想要在第二個渲染過程中對深度附件進行採樣,請確保將附件描述的storeOp設置爲存儲。

+0

現在驗證層'[SC]'說:'Shader消耗輸入附件索引0,但不在子通道中提供。 但是我的顏色輸入附件仍然可以讀取。它只是我遇到的深度附件:( – ToxiCore

+1

)如果您想從輸入附件中採樣,則需要通過pInputAttachments成員在您的子通道描述中指定它。 –

+0

我其實是這樣做的..:/ 我是一個白癡 - 我只是忘記把它與'vkUpdateDescriptorSets'綁定:D 非常感謝您的時間和幫助:) – ToxiCore

相關問題