【问题标题】:Weird behaviour using mipmapping from glsl使用来自 glsl 的 mipmapping 的奇怪行为
【发布时间】:2016-11-01 17:21:23
【问题描述】:

我正在尝试将 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

【问题讨论】:

  • "按照我的说法,渲染的图像应该改变,但根本不是,它总是相同的图像,即使我增加了“1”(层数) .” 为什么?您正在从纹理中获取。为什么你从哪里获取对你写的东西有任何影响?您是否通常希望传递给函数调用的参数会影响函数返回值存储在哪个变量或内存位置?
  • 由于我还没有使用vkCmdBlit,所以我读取的内存内容应该是未定义的^^

标签: glsl vulkan


【解决方案1】:

根据您的默认采样器创建信息 (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 级别应该可以正常工作。

【讨论】:

  • 谢谢!它有效但我还不明白为什么这些值应该是浮动的^^。我为这个采样器的 maxLod 设置了一个高值,在这种情况下,我可以将它重用于多个纹理:p
  • 如果您想知道为什么最小和最大 lod 是浮动的,请查看规范中的详细级别部分 (khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/…)。由于几个原因,例如,使用一个“maxLod 值很高”的采样器并不是一个好主意。如果您在没有明确 lod 的情况下进行采样。
  • 好吧,我会像你一样去 Image/ImageView/Sampler 的一个元组 :)
  • @SaschaWillems 我认为 maxLod 的单个高值可以正常工作,因为根据规范的“图像级别选择”部分,选择的 mip 被限制为 q,即 levelCount - 1 取自图像视图的 subresourceRange
  • @SaschaWillems 我不明白为什么对 maxLod 使用高值是个坏主意。它有任何性能影响吗?就我而言,我正在开发一个基于 Vulkan 和 OpenGL(将来可能是 DirectX)的抽象层,如果我不必在抽象层的 API 中公开另一个参数,而是将 maxLod 设置为例如FLT_MAX 用于创建的每个采样器。
猜你喜欢
  • 1970-01-01
  • 2020-02-10
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多