从glsl使用mipmapping的奇怪行为

时间:2016-11-01 01:09:06

标签: glsl vulkan

我正在尝试使用与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

1 个答案:

答案 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级别,以便正常工作。