RenderPass의 효율적인 후면 효과

11279 단어 Vulkan
RenderPass를 사용하면 특정 사후 효과를 효과적으로 수행할 수 있습니다.여기서는 0.0f~1.0f에서 감소하기만 하면 간단한 색조영사를 실현할 수 있다.이 과정에서 면도기에서SubpassInput의 사용법을 설명해 드리겠습니다.

미리 준비하다


RenderPass에 대한 자세한 내용은 전날 보도를 참조하십시오.

규격 제정


이번에 실시된 색조 매핑은 다음과 같은 경로로 실시될 것이다.

그림의 Rr 및 Out은 리소스(Image)로서 다음 매개변수로 생성됩니다.
  • Rr: Format= VK_FORMAT_R16G16B16A16_SFLOAT
  • Out: Format= VK_FORMAT_R8G8B8A8_UNORM
  • RenderPass 작성


    그럼 우선 Attachment부터 정의합니다.
    const attachmentRr = VkAttachmentDescription { 0, VK_FORMAT_R16G16B16A16_SFLOAT, VK_SAMPLE_COUNT_1_BIT,
      VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_DONT_CARE,
      VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
      VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
    const attachmentOut = VkAttachmentDescription { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
      VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
      VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
      VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL };
    
    일반적인 렌더링을 받는 쪽은 내용을 지워야 하지만 최종적으로 데이터가 필요한 것은 아니기 때문에 지정했습니다.반대로 출력단은 모든 픽셀을 출력하기 때문에 앞의 픽셀은 상관없고 뒤의 RenderPass도 사용할 수 있으니 메모리에 다시 쓰십시오.또한finalLayout을 지정하여 명암 입력(무늬)으로 사용할 수 있습니다.
    그런 다음 Subpass를 정의합니다.
    const passNormalRenderOutput = VkAttachmentReference { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL });
    const passTonemapSource = VkAttachmentReference { 0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL };
    const passTonemapOutput = VkAttachmentReference { 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
    const passNormalRender = VkSubpassDescription { 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
      0, nullptr, 1, &passNormalRenderOutput, nullptr, nullptr, 0, nullptr };
    const passTonemap = VkSubpassDescriptor { 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
      1, &passTonemapSource, 1, &passTonemapOutput, nullptr, nullptr, 0, nullptr};
    
    처음 세 행에는 Attachment에 대한 참조가 정의되어 있습니다.COLOR로 내보내기 -ATTACHMENT_OPTIIMAL, 카드는 SHADERREAD_ONLY_OPTIIMAL이어야 하기 때문에 그 설정을 진행하고 있습니다.나머지 네 줄에서 경로를 정의합니다.
    마지막으로 의존성의 정의다.이번에는 경로 1을 실행하기 전에 경로 0을 완성해야 하기 때문에 여기에 기술합니다.
    const depNormalToTone = VkSubpassDependency { 0, 1, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
      VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
      VK_ACCESS_SHADER_READ_BIT, VK_DEPENDENCY_BY_REGION_BIT };
    
    모든 픽셀에 대해 DEPENDENCY 필요 없음 -BY_REGION_BIT를 지정합니다.
    마지막으로 RenderPass를 작성합니다.
    const attachments = std::make_unique<VkAttachmentDescription[2]>({ attachmentRr, attachmentOut });
    const passes = std::make_unique<VkSubpassDescription[2]>({ passNormalRender, passTonemap });
    const rpinfo = VkRenderPassCreateInfo { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0,
      2, attachments.get(), 2, passes.get(), 1, &depNormalToTone };
    auto res = vkCreateRenderPass(device, &rpinfo, nullptr, &renderPass);
    

    범례 섀도우 생성하기


    이번에는 집게만 하는 면도기를 만들었다.정점 성형기는 정점을 간단하게 출력해서 입력하는 방식만 사용하고 다음은 세션 모드의 코드입니다.
    layout(location = 0) out vec4 color;
    layout(set = 0, binding = 0, input_attachment_index = 0) uniform subpassInput intex;
    
    void main() { color = clamp(subpassLoad(intex), vec4(0.0f), vec4(1.0f)); }
    
    두 번째 행의 정의는 첨부 파일을 가져올 때의 정의입니다.첨부 파일을 유니폼 값으로 입력하면 Piperline Layout도 정의해야 한다.입력 첨부는 무늬가 아니기 때문에 자신의 유형subpassInput으로 표시한다.subpassInput를 사용하여 픽셀 데이터를 읽습니다.subpassLoad만 납부subpassLoad할 수 있는데 이것은 울타리화 픽셀에 대응하는 픽셀 데이터만 얻을 수 있기 때문이다.따라서 subpassInput를 사용하여 구리관과 같은 처리를 실시할 수 없다.

    입력 첨부 파일 수신 준비


    앞에서 처리한 바와 같이 첨부 파일을 제복 값으로 입력하면 수신되기 때문에 Piperline Layout에 등록해야 한다. 즉, 해당하는Descriptor SetLayout을 만들어야 한다.
    입력 첨부 파일 대응subpassInputVkDescriptorType이므로 지정합니다.
    const descbindToneInput = VkDescriptorSetBinding { 0,
      VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1,
      VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };
    
    이제 Framebuffer를 일반적으로 준비하여 파이프라인을 구성하여 그립니다.샘플의 모든 코드는 없지만 이렇게 할 수도 있어요.그 외에 특정 영역만 덮어쓰는 다각형 등 두 번째로 모든 다각형을 덮어쓰면 템플릿과 유사할 수 있다고 생각합니다.

    좋은 웹페이지 즐겨찾기