我在 Vulkan 中的采样器有问题:无论我使用 VK_FILTER_NEAREST
或 VK_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_LINEAR
和 VK_SAMPLER_MIPMAP_MODE_LINEAR
一样,我真的不知道出了什么问题。
有人有想法吗?谢谢。
更多信息:
这是图像纹理(一个简单的 8x8 .png,每个 4x4 角都有不同的颜色):
这是使用 VK_FILTER_NEAREST
和 VK_SAMPLER_MIPMAP_MODE_NEAREST
的结果:
这是立方体的 .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/