前面创建了color和depth的Image和ImageView,还少一个sampler。
在SceneWidget.h中,添加函数接口bool CreateSampler()和一个VkSampler m_sampler = VK_NULL_HANDLE。
先在SceneWidget::Init函数中添加这个函数的调用:
在SceneWidget.cpp中实现这个函数,还和以前一样,先写生成函数,然后补齐参数,调用vkCreateSampler();
第一个参数:m_device。
第二个参数:VkSamplerCreateInfo类型的指针,所以补一个数据结构VkSamplerCreateInfo createInfo = {};输入&createInfo。
第三个参数:nullptr。
第四个参数:&m_sampler。
使用VkResult检查返回值。
补齐createInfo的属性:
createInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
createInfo.pNext = nullptr;
createInfo.flags = 0;
采样有点采样和线性采样,这里采用线性采样,或保持默认也可以。
createInfo.magFilter = VK_FILTER_LINEAR;
createInfo.minFilter = VK_FILTER_LINEAR;
保持默认就行,默认为:VK_SAMPLER_MIPMAP_MODE_NEAREST,这里的纹理不是mpmap的,所以这个属性应该是用不到的。
createInfo.mipmapMode;
对应于uvw的贴图环绕方式。这里使用重复贴图方式,即纹理坐标大于1时,进行重复。
createInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
createInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
createInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
分级细化的偏差值,这里为0.0f。分级细化可以看做是过滤的一种。
createInfo.mipLodBias;
各向异性是否开启。
createInfo.anisotropyEnable = VK_TRUE;
可向异性的最大值,如果createInfo.anisotropyEnable值为VK_FALSE,则忽略这个值。
createInfo.maxAnisotropy = 16.0;
将样本与一个设定值进行比较,结果将用于过滤,一般阴影时会用到这一特性。
createInfo.compareEnable = VK_FALSE;
比较操作,由于createInfo.compareEnable为false,所以这个值可一直通过就行。
createInfo.compareOp = VK_COMPARE_OP_ALWAYS;
Lod的最小值。一般取0
createInfo.minLod = 0;
Lod的最大值,取mipMap的层级。这里没有用到mipmap,可取1。
createInfo.maxLod = 1;
边框的颜色,取VK_BORDER_COLOR_INT_OPAQUE_BLACK
createInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
纹理坐标是否归一化,为VK_TRUE时,坐标使用真实值,是从0到纹理的最大值。为VK_FALSE时,为0到1之间。
createInfo.unnormalizedCoordinates = VK_FALSE;
最终函数的样子:
在SceneWidget::UnInit函数里添加清理
vkDestroySampler(m_device, m_sampler, nullptr);
然后运行程序,结果如下:
没有错误信息:)