我试着用mipmapping和vulkan。我知道我应该在每一层之间对每个图像使用vkCmdBlit,但在这样做之前,我只想知道如何在GLSL中更改该层。
这就是我所做的。首先,我加载并绘制一个纹理(使用第0层),没有问题。“呈现的图像”是我加载的纹理,所以它很好。
其次,我使用这个着色器(所以我想使用第二层(数字1)),但是“呈现的图像”没有改变:
#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
发布于 2016-11-01 09:21:23
根据默认的取样器创建信息(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级别可以很好地工作。
https://stackoverflow.com/questions/40352791
复制相似问题