【发布时间】:2019-07-15 06:28:06
【问题描述】:
我在 Vulkan 中的采样器有问题:无论我使用 VK_FILTER_NEAREST 或 VK_FILTER_LINEAR 为放大或缩小过滤器创建采样器,我的纹理都将被采样,就像我使用 @ 创建它一样987654327@;
这是我创建采样器的方法:
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 上工作.
【问题讨论】:
-
我想这个错误在其他地方——也许你最终没有以某种方式使用那个采样器。如果您还没有,我建议您启用验证层。假设没有验证层错误,我建议您运行 RenderDoc - 您可以在其中检查整个管道状态的详细信息。
-
该采样器是我程序中唯一的一个,所以我肯定会使用它,而且没有验证层错误。
-
这种情况请提供完整的例子,无法调试片段...stackoverflow.com/help/mcve
-
如果这确实是您传递给着色器的采样器,那么它应该进行最近的过滤。但是如果没有所有相关的代码部分,就很难判断。最简单的方法是通过例如运行这个RenderDoc 并检查您设置的采样器值是否实际传递给 api。
-
@SaschaWillems 我用 RenderDoc 截取了屏幕截图并在 vkCmdDrawIndexed 期间检查了采样器:i.imgur.com/ve5SEsz.png 如您所见,我使用了正确的采样器,还启用了
NEAREST模式(底部-右)。