Vulkan笔记(七)---图像视图
在渲染管线中使用任何 VkImage,包括交换链中的 VkImage 我们必须创建一个 VkImageView 对象。
创建图像视图
std::vector<VkImage> swapChainImages_;
std::vector<VkImageView> swapChainImageViews_;void CVulkanApp::createImageViews()
{swapChainImageViews_.resize(swapChainImages_.size());for (size_t i=0; i < swapChainImages_.size(); ++i) {VkImageViewCreateInfo viewInfo{};viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;viewInfo.image = swapChainImages_[i];viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;viewInfo.format = swapChainImageFormat_;viewInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;viewInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;viewInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;viewInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;viewInfo.subresourceRange.baseMipLevel = 0;viewInfo.subresourceRange.levelCount = 1;viewInfo.subresourceRange.baseArrayLayer = 0;viewInfo.subresourceRange.layerCount = 1;if (vkCreateImageView(logicDevice_, &viewInfo, nullptr, &swapChainImageViews_[i])!= VK_SUCCESS){throw std::runtime_error("failed to create image views!");}}}这段代码是Vulkan中创建图像视图(Image Views)的实现,用于为交换链(Swap Chain)中的每个图像创建对应的视图。以下是关键点解释:
功能概述:
为交换链中的每个VkImage创建对应的VkImageView,使渲染管线能够访问这些图像
图像视图定义了如何解释图像数据以及访问图像的哪部分
核心参数配置:
viewType:设置为2D纹理视图(VK_IMAGE_VIEW_TYPE_2D),这是最常见的交换链图像类型format:使用交换链创建时确定的格式(swapChainImageFormat_),确保视图与图像格式一致components:颜色通道映射设置为默认值,表示不进行通道映射。
子资源范围配置:
aspectMask:设为颜色位(VK_IMAGE_ASPECT_COLOR_BIT),因为这是颜色附件levelCount/layerCount:都设为1,表示不使用mipmap和多层纹理
创建过程:
先调整vector大小以容纳所有视图
循环为每个交换链图像创建视图
使用vkCreateImageView创建视图,失败时抛出异常
典型应用场景:
这些视图后续会用作帧缓冲的颜色附件
是渲染管线配置的前置步骤
注意:创建的资源需要在程序退出时通过vkDestroyImageView销毁。这段代码是Vulkan渲染初始化的标准流程之一,确保了交换链图像能被正确访问和使用。
销毁图像视图
void CVulkanApp::destroyImageViews()
{// 销毁 ImageViewsfor (auto imageView : swapChainImageViews_){if (imageView != VK_NULL_HANDLE){vkDestroyImageView(logicDevice_, imageView, nullptr);}}swapChainImageViews_.clear();
}图像视图是由我们显式创建的,在程序结束时再次销毁它们。
