vulkan学习笔记十二

前面创建了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);

然后运行程序,结果如下:

没有错误信息:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值