使用来自 glsl 的 mipmapping 的奇怪行为

Weird behaviour using mipmapping from glsl

我正在尝试将 mipmapping 与 vulkan 结合使用。我知道我应该在每个图像的每个图层之间使用 vkCmdBlit,但在这样做之前,我只想知道如何更改 GLSL 中的图层。

这是我所做的。 首先我加载并绘制一个纹理(使用层 0)并且没有问题。 "rendered image"是我加载的纹理,所以很好。

其次,我使用了这个着色器(所以我想使用第二层(编号 1))但是 "rendered image" 没有改变 :

#version 450

layout(set = 0, binding = 0) uniform sampler2D tex;

in vec2 texCoords;

layout(location = 0) out vec4 outColor;

void main() {
    outColor = textureLod(tex, texCoords, 1);
}

根据我的说法,渲染图像应该改变,但根本不会,它总是相同的图像,即使我增加“1”(层数)。

第三,而不是更改 glsl 代码中的任何内容,我将图层编号更改为 ImageSubresourceRange 以创建 imageView,并且 "rendered image" 已更改,所以这对我来说似乎很正常,当我将使用 vkCmdBlit 时,我必须以较低的分辨率查看原始图像。

真正的问题是,当我尝试在 GLSL 中使用 mipmapping(通过 mipmapping)时,它根本不会影响渲染图像,但在 C++ 中它会影响(这看起来很公平)。

这是(全部)我的源代码 https://github.com/qnope/Vulkan-Example/tree/master/Mipmap

根据您的默认采样器创建信息 (https://github.com/qnope/Vulkan-Example/blob/master/Mipmap/VkTools/System/sampler.cpp#L28) 判断,您始终将采样器的 maxLod 成员设置为零,因此您的 lod 始终被限制在 0.0 和 0.0 之间 (minLod/maxLod)。这符合您描述的行为。

因此请尝试将采样器创建信息的 maxLod 成员设置为纹理中 mip 贴图的实际数量,并更改着色器中的 lod 级别应该可以正常工作。