FCT
载入中...
搜索中...
未找到
VK_TextureView.cpp
浏览该文件的文档.
1//
2// Created by Administrator on 2025/4/15.
3//
4
5#include "VK_TextureView.h"
6
7#include "VK_Image.h"
9
10namespace FCT
11{
12 namespace RHI
13 {
15 : m_ctx(ctx), m_view(nullptr)
16 {
17 }
18
20 {
21 if (m_view) {
22 m_ctx->getDevice().destroyImageView(m_view);
23 m_view = nullptr;
24 }
25 }
26
28 {
29 if (!m_image) {
30 ferr << "Cannot create texture view: no image set" << std::endl;
31 return;
32 }
33
34 VK_Image* vkImage = dynamic_cast<VK_Image*>(m_image);
35 if (!vkImage) {
36 ferr << "Cannot create texture view: image is not a VK_Image" << std::endl;
37 return;
38 }
39
40 Format format = m_image->format();
41 vk::ImageViewType viewType = vk::ImageViewType::e2D;
42
43 vk::ImageAspectFlags aspectMask = getImageAspectFlags(ToVkFormat(format));
44
45
46 vk::ImageViewCreateInfo viewInfo;
47 viewInfo.setImage(vkImage->getVkImage());
48 viewInfo.setViewType(viewType);
49 viewInfo.setFormat(ToVkFormat(format));
50
51 viewInfo.components.r = vk::ComponentSwizzle::eR;
52 viewInfo.components.g = vk::ComponentSwizzle::eG;
53 viewInfo.components.b = vk::ComponentSwizzle::eB;
54 viewInfo.components.a = vk::ComponentSwizzle::eA;
55
56 viewInfo.subresourceRange.aspectMask = aspectMask;
57 viewInfo.subresourceRange.baseMipLevel = 0;
58 viewInfo.subresourceRange.levelCount = 1;
59 viewInfo.subresourceRange.baseArrayLayer = 0;
60 viewInfo.subresourceRange.layerCount = 1;
61
62 try {
63 m_view = m_ctx->getDevice().createImageView(viewInfo);
64 }
65 catch (const std::exception& e) {
66 ferr << "Failed to create texture view: " << e.what() << std::endl;
67 m_view = nullptr;
68 }
69 }
70 vk::ImageAspectFlags VK_TextureView::getImageAspectFlags(vk::Format format)
71 {
72 if (format == vk::Format::eD16Unorm ||
73 format == vk::Format::eD32Sfloat ||
74 format == vk::Format::eX8D24UnormPack32) {
75 return vk::ImageAspectFlagBits::eDepth;
76 }
77
78 if (format == vk::Format::eD24UnormS8Uint ||
79 format == vk::Format::eD32SfloatS8Uint ||
80 format == vk::Format::eD16UnormS8Uint) {
81 return vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
82 }
83
84 if (format == vk::Format::eS8Uint) {
85 return vk::ImageAspectFlagBits::eStencil;
86 }
87
88 return vk::ImageAspectFlagBits::eColor;
89 }
90 }
91}
vk::ImageAspectFlags getImageAspectFlags(vk::Format format)
std::ostream & ferr
vk::Format ToVkFormat(Format format)