首页 > 解决方案 > VK_FILTER_NEAREST 在采样期间不工作

问题描述

我在 Vulkan 中的采样器存在问题:无论我使用放大或缩小过滤器创建采样VK_FILTER_NEARESTVK_FILTER_LINEAR,我的纹理都将被采样,就好像我使用VK_FILTER_LINEAR;创建它一样。

这是我创建采样器的方法:

void                         Gui::Texture_2D::createVkSampler(const VkFilter & _magFilter,
                                                              const VkFilter & _minFilter,
                                                              const VkSamplerMipmapMode & _mipMapFilter,
                                                              const unsigned char & _maxAnisotropy) {
    VkSamplerCreateInfo samplerInfo = {};

    samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
    samplerInfo.magFilter = _magFilter; // VK_FILTER_NEAREST
    samplerInfo.minFilter = _minFilter; // VK_FILTER_NEAREST
    samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
    samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
    samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
    samplerInfo.anisotropyEnable = _maxAnisotropy == 0 ? VK_FALSE : VK_TRUE; // 0
    samplerInfo.maxAnisotropy = _maxAnisotropy; // 0
    samplerInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
    samplerInfo.unnormalizedCoordinates = VK_FALSE;
    samplerInfo.compareEnable = VK_FALSE;
    samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS;
    samplerInfo.mipmapMode = _mipMapFilter; // VK_SAMPLER_MIPMAP_MODE_NEAREST
    samplerInfo.mipLodBias = 0.0f;
    samplerInfo.minLod = 0.0f;
    samplerInfo.maxLod = static_cast<float>(image.getMipLevels());

    if (vkCreateSampler(logicalDevice, &samplerInfo, nullptr, &sampler) != VK_SUCCESS)
        throw std::runtime_error("Texture sampler creation failed!");

}

...但是纹理渲染得好像我通过了VK_FILTER_LINEARand VK_SAMPLER_MIPMAP_MODE_LINEAR,我真的不知道出了什么问题。

有人有想法吗?谢谢。

更多信息

这是图像纹理(一个简单的 8x8 .png,每个 4x4 角具有不同的颜色):

这里

这是使用VK_FILTER_NEARESTand的结果VK_SAMPLER_MIPMAP_MODE_NEAREST

这里2

这是立方体的 .obj 文件,带有法线和纹理坐标:

# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
mtllib untitled.mtl
o Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v 1.000000 1.000000 1.000000
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn 0.0000 0.0000 -1.0000
usemtl Material
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/2 8/6/2 7/7/2 6/8/2
f 1/1/3 5/9/3 6/10/3 2/11/3
f 2/12/4 6/13/4 7/7/4 3/14/4
f 3/15/5 7/16/5 8/17/5 4/4/5
f 5/5/6 1/18/6 4/19/6 8/20/6

我希望有类似 Minecraft 的行为,但我得到了我应该使用VK_FILTER_LINEAR.

谢谢。

更新

我在另一台电脑上运行程序并且纹理采样正确,我想我的 GPU 存在错误/故障/问题,我会尝试更新我的驱动程序。

更新 2

我更新了我的 GPU 驱动程序,现在我正在使用最新的 Vulkan SDK 版本(1.1.101.0),仍然没有;采样器的 RenderDoc 分析报告没有问题,我使用了正确的过滤器;删除/不使用 mipmap 没有帮助;没有一个验证层错误。

我开始认为我的 GPU 仍然不能很好地支持 Vulkan(Intel HD Graphics 620)所以我想我必须接受它并继续,知道至少它可以在其他 PC 上工作。

更新 3

我更新了我的 GPU 驱动程序,现在我正在使用最新的 Vulkan SDK 版本(1.1.114.0),仍然没有;采样器的 RenderDoc 分析报告没有问题,我使用了正确的过滤器;删除/不使用 mipmap 没有帮助;没有一个验证层错误。

我开始认为我的 GPU 仍然不能很好地支持 Vulkan(Intel HD Graphics 620)所以我想我必须接受它并继续,知道至少它可以在其他 PC 上工作。

标签: c++imagevulkan

解决方案


我遇到了完全相同的问题,并决定搞砸VkSamplerCreateInfo并发现解决问题的设置anisotropyEnabledVK_FALSE但我不知道为什么。


推荐阅读