c++ - VK_FILTER_NEAREST 在采样期间不工作
问题描述
我在 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
and VK_SAMPLER_MIPMAP_MODE_LINEAR
,我真的不知道出了什么问题。
有人有想法吗?谢谢。
更多信息:
这是图像纹理(一个简单的 8x8 .png,每个 4x4 角具有不同的颜色):
这是使用VK_FILTER_NEAREST
and的结果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
但我不知道为什么。
推荐阅读
- java - iTextPDF 签名:如何不显示签名字段,但显示图像
- javascript - 如何使用ajax jquery发送多个数据?
- python-3.x - 我正在使用 python,但我无法使用 openCV 检测 QR 码
- angular - 以角度 6 实现虚拟滚动
- reactjs - 无法在 express 中获取我的数据并做出反应错误:无法在窗口上执行 feth
- c - 如何在 C 中创建和读取数据类型的动态数组?
- twitter-bootstrap - “未定义变量”搜索功能
- unity3d - 从统一 webGL 向 Vue js 发送消息
- android - Android Studio 中的奇怪错误 - 为什么未解决?
- xpath - Xpath 定位器到相同的 Web 元素