c++ - VK_FILTER_NEAREST 在采样期间不起作用

标签 c++ image vulkan

我在 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_LINEARVK_SAMPLER_MIPMAP_MODE_LINEAR 一样,我真的不知道出了什么问题。

有人有想法吗?谢谢。

更多信息:

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

Here

这是使用 VK_FILTER_NEARESTVK_SAMPLER_MIPMAP_MODE_NEAREST 的结果:

Here2

这是立方体的 .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 上运行.

最佳答案

我遇到了完全相同的问题,决定尝试一下 VkSamplerCreateInfo 并发现将 anisotropyEnabled 设置为 VK_FALSE 可以解决问题,但是我不知道为什么。

关于c++ - VK_FILTER_NEAREST 在采样期间不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54805427/

相关文章:

c++ - if-else VS map 查找

c# - 命名管道消息无法通过 (Windows/C++)

c++ - #includes 在命名空间中,到 "embed"命名空间中的预写内容

c++ - 如何从 bmp 文件制作动画 png?

c++ - 函数重载中的隐式转换序列

python ,PIL;文本到图像和字体

django - 自定义ImageField.image.url

vulkan - Vulkan 描述符集池中最大集数的用途是什么?

c++ - 无法创建具有传输队列支持的 VkDevice

vulkan - 我是否必须指定两个阶段标志以确保正确的内存失效?