2016-11-06 1 views
0

2 차 하위 패스의 InputAttachment로 DepthBuffer를 구현하는 데 문제가 있습니다. 첫 번째 서브 패스의 깊이 정보를 사용하고 싶습니다. 이걸 어떻게 성취 할 수 있니? 다음과 같이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;을 사용하여 접근했다. 정보는 모든 컬러 채널에 대해서만 제로이다. 당신이 subpasses을하고 (그리고 패스를 여러 렌더링되지 않음)하는 경우

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

방금 ​​내 코드의 excerts를 추가했습니다 :) – ToxiCore

+0

여기에 일부 누락 된 코드가있는 것 같습니다. 예를 들어, 레이아웃 장벽은 이미지가 ATTACHMENT_OPTIMAL 레이아웃에 있음을 나타냅니다. 그러나 당신은'VkAttachmentReference'가 READ_ONLY_OPTIMAL 레이아웃을 지정한다고 말합니다. 그래서 우리에게 말하지 않는 레이아웃 전환이 있거나 Vulkan에 거짓말을하고 Vulkan 유효성 검사 레이어를 사용하면 이러한 오류가 발생했을 것입니다. –

답변

2

하고 깊이 버퍼를 사용하려면 :


는 또한 나는이 종속성을 사용 입력으로을 첨부하고 보조 입력으로 보조 장치를 사용하려면 하위 패스,

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

은 쉐이더에 그에서 맛볼 수 올바른 구문이 아닙니다. 이것은 또한 입력 VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 대신 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER의 기술자를 필요

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

: 입력에서 첨부

샘플링 특정 구문을 필요로한다. 입력 첨부 파일의 실제 설명자에는 샘플러가 필요하지 않습니다.

두 번째 렌더 패스에서 깊이 첨부 파일을 샘플링하려는 경우 첨부 파일 설명의 storeOp가 저장하도록 설정되어 있는지 확인하십시오.

+0

이제 유효성 확인 레이어'[SC]'는'Shader는 입력 첨부 인덱스 0을 소비하지만 서브 패스에서는 제공되지 않습니다 '라고 말합니다. 그러나 필자가 여전히 읽을 수있는 필자의 컬러 입력 파일 첨부 ... 필자는 문제가있는 깊이 첨부 파일 일뿐입니다. ( – ToxiCore

+1

입력 첨부 파일에서 샘플링하려면 pInputAttachments 멤버를 통해 하위 패스 설명에 지정해야합니다. –

+0

음 나는 실제로 그렇게했다.:/ 나는 바보입니다. 단지 vkUpdateDescriptorSets'와 바인딩하는 것을 잊었습니다. D 대단히 감사합니다. :) – ToxiCore

관련 문제