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을 설정해야함
https://vulkan-tutorial.com/Drawing_a_triangle/Presentation/Image_views
'그래픽스 > vk' 카테고리의 다른 글
[vk] Drawing triangle - graphics pipeline basics - Shader modules (0) | 2021.08.09 |
---|---|
[vk] Drawing triangle - graphics pipeline basics - introduction (0) | 2021.08.09 |
[vk] Drawing triangle - Presentation - Swap chain (0) | 2021.08.07 |
[vk] Drawing triangle - Presentation - Window surface (0) | 2021.08.06 |
[vk] Drawing triangle - setup - Logical device and queue (0) | 2021.08.06 |