FCT
载入中...
搜索中...
未找到
VK_Sampler.cpp
浏览该文件的文档.
1
2
3#include "../ThirdParty.h"
5#include "VK_Sampler.h"
6
7namespace FCT
8{
9 namespace RHI
10 {
12 : m_ctx(ctx), m_sampler(nullptr)
13 {
14 }
15
17 {
18 if (m_sampler) {
19 m_ctx->getDevice().destroySampler(m_sampler);
20 m_sampler = nullptr;
21 }
22 }
23
25 {
26 if (m_sampler) {
27 m_ctx->getDevice().destroySampler(m_sampler);
28 m_sampler = nullptr;
29 }
30
31 vk::SamplerCreateInfo samplerInfo;
32 samplerInfo.setMagFilter(toVkFilter(m_magFilter));
33 samplerInfo.setMinFilter(toVkFilter(m_minFilter));
34 samplerInfo.setMipmapMode(toVkMipmapMode(m_mipmapFilter));
35
36 samplerInfo.setAddressModeU(toVkAddressMode(m_addressModeU));
37 samplerInfo.setAddressModeV(toVkAddressMode(m_addressModeV));
38 samplerInfo.setAddressModeW(toVkAddressMode(m_addressModeW));
39
40 samplerInfo.setMipLodBias(m_mipLodBias);
41 samplerInfo.setAnisotropyEnable(m_anisotropyEnable);
42 samplerInfo.setMaxAnisotropy(m_maxAnisotropy);
43
44 samplerInfo.setCompareEnable(m_compareEnable);
45 samplerInfo.setCompareOp(toVkCompareOp(m_compareOp));
46
47 samplerInfo.setMinLod(m_minLod);
48 samplerInfo.setMaxLod(m_maxLod);
49
50 samplerInfo.setBorderColor(toVkBorderColor(m_borderColor));
51 samplerInfo.setUnnormalizedCoordinates(m_unnormalizedCoordinates);
52
53 try {
54 m_sampler = m_ctx->getDevice().createSampler(samplerInfo);
55 }
56 catch (const std::exception& e) {
57 ferr << "Failed to create sampler: " << e.what() << std::endl;
58 m_sampler = nullptr;
59 }
60 }
61
62 vk::Filter VK_Sampler::toVkFilter(FilterMode mode) const
63 {
64 switch (mode) {
66 return vk::Filter::eNearest;
68 return vk::Filter::eLinear;
69 default:
70 return vk::Filter::eLinear;
71 }
72 }
73
74 vk::SamplerMipmapMode VK_Sampler::toVkMipmapMode(FilterMode mode) const
75 {
76 switch (mode) {
78 return vk::SamplerMipmapMode::eNearest;
80 return vk::SamplerMipmapMode::eLinear;
81 default:
82 return vk::SamplerMipmapMode::eLinear;
83 }
84 }
85
86 vk::SamplerAddressMode VK_Sampler::toVkAddressMode(AddressMode mode) const
87 {
88 switch (mode) {
90 return vk::SamplerAddressMode::eRepeat;
92 return vk::SamplerAddressMode::eMirroredRepeat;
94 return vk::SamplerAddressMode::eClampToEdge;
96 return vk::SamplerAddressMode::eClampToBorder;
98 return vk::SamplerAddressMode::eMirrorClampToEdge;
99 default:
100 return vk::SamplerAddressMode::eRepeat;
101 }
102 }
103
104 vk::CompareOp VK_Sampler::toVkCompareOp(CompareOp op) const
105 {
106 switch (op) {
107 case CompareOp::Never:
108 return vk::CompareOp::eNever;
109 case CompareOp::Less:
110 return vk::CompareOp::eLess;
111 case CompareOp::Equal:
112 return vk::CompareOp::eEqual;
114 return vk::CompareOp::eLessOrEqual;
116 return vk::CompareOp::eGreater;
118 return vk::CompareOp::eNotEqual;
120 return vk::CompareOp::eGreaterOrEqual;
122 return vk::CompareOp::eAlways;
123 default:
124 return vk::CompareOp::eNever;
125 }
126 }
127
129 {
130 switch (color) {
132 return vk::BorderColor::eFloatTransparentBlack;
134 return vk::BorderColor::eFloatOpaqueBlack;
136 return vk::BorderColor::eFloatOpaqueWhite;
137 default:
138 return vk::BorderColor::eFloatOpaqueBlack;
139 }
140 }
141 }
142}
vk::SamplerMipmapMode toVkMipmapMode(FilterMode mode) const
VK_Sampler(VK_Context *ctx)
vk::CompareOp toVkCompareOp(CompareOp op) const
vk::SamplerAddressMode toVkAddressMode(AddressMode mode) const
vk::Filter toVkFilter(FilterMode mode) const
vk::BorderColor toVkBorderColor(BorderColor color) const
AddressMode m_addressModeU
AddressMode m_addressModeW
BorderColor m_borderColor
bool m_anisotropyEnable
FilterMode m_magFilter
float m_maxAnisotropy
FilterMode m_minFilter
CompareOp m_compareOp
AddressMode m_addressModeV
bool m_unnormalizedCoordinates
FilterMode m_mipmapFilter
std::ostream & ferr