[vk] Drawing triangle - Presentation - Image views

2021. 8. 9. 02:54그래픽스/vk

1. Image views

- 어떠한 VkImage 를 사용하려면, render pipeline에서  VkImageView 객체를 생성해야한다.

- image view는 말그대로 이미지를 보는것.

- 어떻게 image에 접근하는지 기술하며, image의 어느 부분을 접근하는지 기술한다.

- ex) 이미지가 mipmapping levels 과 관계없이, 2D texture depth texture 로서 처리되어야하는 경우 접근 방법등

 

createImageViews

- swapchain의 모든 이미지에 대한 기본 image view를 만듬

- 그 이후 color targets으로서 사용

- 저장할 vector 멤버변수를 추가해야함.

std::vector<VkImageView> swapChainImageViews;

 

2. createImageViews

- createImageViews함수를 만들고, swapchain 생성 직후에 호출

void initVulkan() {
    createInstance();
    setupDebugMessenger();
    createSurface();
    pickPhysicalDevice();
    createLogicalDevice();
    createSwapChain();
    createImageViews();
}

void createImageViews() {

}

- 가장 먼저해야할 일은 imageViews 벡터의 크기를 조정하는 것

void createImageViews() {
    swapChainImageViews.resize(swapChainImages.size());

}

 

2.1 createInfo

- 다음으로 모든 swapchain Images를 반복하는 루프를 설정

- imageview 또한 createInfo 구조체를 만들어 생성함.  VkImageViewCreateInfo

- viewType, format : 이미지 데이터를 해석하는 방법을 지정, 

- viewType : 1D textures, 2D textures, 3D textures and cube maps

- components : 주변의 색상 채널을 바꿀 수 있음 (swizzle) 

- - - - ex) monochrome texture의 경우, 모든 채널을 빨간색 채널에 매핑할 수 있음.

- - - - You can also map constant values of 0 and 1 to a channel

- - - - 여기선 default mapping을 사용

- subresourceRange : image의 목적에 따라 접근해야하는 부분을 기술,

- - - - 우리의 이미지는 color targets으로만 사용 (without any mipmapping levels or multiple layers)

- - - - stereographic 3D application의 경우  여러 레이어가 있는 swapchain을 만들것,

- - - - multiple image view를 통해 다른 layers를 접근해서 오른쪽, 왼쪽 눈의 시야로본 여러 이미지를 나타낼 수 있음.

-  vkCreateImageView : 마지막으로 호출하여 imageview를 생성함.

for (size_t i = 0; i < swapChainImages.size(); i++) {
    VkImageViewCreateInfo createInfo{};
    createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
    createInfo.image = swapChainImages[i];
    
    createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
    createInfo.format = swapChainImageFormat;
    
    createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
    createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
    createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
    createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
    
    createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
    createInfo.subresourceRange.baseMipLevel = 0;
    createInfo.subresourceRange.levelCount = 1;
    createInfo.subresourceRange.baseArrayLayer = 0;
    createInfo.subresourceRange.layerCount = 1;
	
    if (vkCreateImageView(device, &createInfo, nullptr, &swapChainImageViews[i]) != VK_SUCCESS) {
	    throw std::runtime_error("failed to create image views!");
	}
}

 

 

 

3. cleanup

- image랑 달리 imageView는 명시적으로 생성되었으므로, 프로그램 종료 시 명시적으로 삭제해줘야함

void cleanup() {
    for (auto imageView : swapChainImageViews) {
        vkDestroyImageView(device, imageView, nullptr);
    }

    ...
}

 

- image view는 image textrue로 사용하기에 충분, 하지만 아직 렌더 대상으로 사용할 준비가 되지않음

- 이를 위해서 framebuffer로 알려진 indirection 단계가 하나 남아있음.

- 하지만 그 이전에 먼저 graphics pipeline을 설정해야함

 

 

C++ code

 

https://vulkan-tutorial.com/Drawing_a_triangle/Presentation/Image_views