我正在尝试使用与vulkan的mipmapping。我明白我应该在每个图层之间为每个图像使用vkCmdBlit,但在此之前,我只是想知道如何更改GLSL中的图层。
这就是我所做的。 首先,我加载并绘制一个纹理(使用第0层),没有问题。 "渲染图像"是我加载的纹理,所以很好。
其次,我使用这个着色器(所以我想使用第二层(数字1))但是#34;渲染图像"不会改变:
#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,以及"渲染图像"改变了,所以对我来说似乎很正常,当我使用vkCmdBlit时,我必须以较低的分辨率看到原始图像。
真正的问题是,当我尝试在GLSL中使用mipmapping(通过mipmapping)时,它不会影响所有渲染的图像,但是在C ++中它确实会影响(这看起来很公平)。
这是(全部)我的源代码 https://github.com/qnope/Vulkan-Example/tree/master/Mipmap
答案 0 :(得分:4)
根据您的默认采样器创建信息(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级别,以便正常工作。