본문 바로가기

Vulkan

Drawing - Framebuffers

이전 글: Graphics pipeline basics- Conclusion

다음 글 : Drawing - Command buffers



Drawing - Framebuffers
프레임 버퍼

우리는 지난 몇 장에서 프레임 버퍼에 대해 많이 이야기 했고 스왑 체인 이미지와 동일한 형식의 단일 프레임 버퍼를 생각한  렌더링 패스를 구성 했지만 아직 실제로 만들지는 않았습니다.


렌더링 패스 생성 중에 지정된 어테치먼트는 VkFramebuffer 객체로 래핑하여 바인딩됩니다.

모든 VkImageView 오브젝트를 참조하는 프레임버퍼는 어테치먼트를 표현 합니다.

우리의 경우에는 색상 어테치먼트 하나입니다 . 그러나 어테치먼트로 사용해야 하는 이미지는 스왑 체인이 표시 할 이미지를 검색 할 때 스왑 체인이 반환하는 이미지에 따라 다릅니다. 즉, 스왑 체인의 모든 이미지에 대해 프레임 버퍼를 만들고 드로잉 할 때 해당 이미지에 해당하는 프레임 버퍼를 사용해야합니다.


이를 위해 프레임 버퍼를 보유 할 다른 std :: vector 클래스 멤버가 필요 합니다.


std::vector<VkFramebuffer> swapChainFramebuffers;

.

그래픽 파이프 라인을 생성 한 직후에 initVulkan에서 호출되는 새 함수 createFramebuffers에 이 벡터에 대한 객체를 만듭니다.


void initVulkan() {
   createInstance();
   setupDebugCallback();
   createSurface();
   pickPhysicalDevice();
   createLogicalDevice();
   createSwapChain();
   createImageViews();
   createRenderPass();
   createGraphicsPipeline();
   createFramebuffers();
}

...

void createFramebuffers() {

}


모든 프레임 버퍼를 포함 할수 있도록 컨테이너의 크기를 설정하여 시작하십시오.


for (size_t i = 0; i < swapChainImageViews.size(); i++) {
   VkImageView attachments[] = {
       swapChainImageViews[i]
   };

   VkFramebufferCreateInfo framebufferInfo = {};
   framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
   framebufferInfo.renderPass = renderPass;
   framebufferInfo.attachmentCount = 1;
   framebufferInfo.pAttachments = attachments;
   framebufferInfo.width = swapChainExtent.width;
   framebufferInfo.height = swapChainExtent.height;
   framebufferInfo.layers = 1;

   if (vkCreateFramebuffer(device, &framebufferInfo, nullptr, &swapChainFramebuffers[i]) != VK_SUCCESS) {
       throw std::runtime_error("failed to create framebuffer!");
   }
}



보시다시피, 프레임 버퍼 생성은 매우 간단합니다. 먼저 renderPass와 프레임 버퍼가 호환 되어야 하는지를 지정해야 합니다. 프레임 버퍼는 호환 가능한 렌더링 패스와 함께만 사용할 수 있습니다. 이는 대략 동일한 갯수와 타입의 어테치먼트를 사용애야 한다는 것을 의미 합니다.


attachmentCount 및 pAttachments 매개 변수는 렌더링 패스 pAttachment 배열의 각 첨부 설명에 바인딩 되어야 하는 VkImageView 객체를 지정합니다.


width 및 height 매개 변수는 자체 참조가 가능하며 레이어는 이미지 배열의  레이어 수를 나타냅니다. 스왑 체인 이미지는 단일 이미지 이므로 레이어 수는 1입니다.


렌더링을 완료 한 후에 만 프레임 버퍼가 이미지 뷰와 렌더 패스를 삭제되기 전에 삭제해야 합니다.


void cleanup() {
   for (auto framebuffer : swapChainFramebuffers) {
       vkDestroyFramebuffer(device, framebuffer, nullptr);
   }

   ...
}


이제는 렌더링에 필요한 모든 개체가 있는 이정표에 도달했습니다. 다음 장에서는 첫 번째 실제 그리기 명령을 작성하고자 합니다.


C++ code / Vertex shader / Fragment shader


이전 글: Graphics pipeline basics- Conclusion

다음 글 : Drawing - Command buffers



'Vulkan' 카테고리의 다른 글

Drawing - Rendering and presentation  (0) 2018.01.25
Drawing - Command buffers  (1) 2018.01.25
Graphics pipeline basics- Conclusion  (0) 2018.01.24
Graphics Pipeline basics - Render passes  (0) 2018.01.24
Graphics Pipeline basics - Fixed function  (0) 2018.01.24