Vulkan 加载 8 位格式的纹理在渲染时呈白色

Séb*_*ans 0 floating-point image vulkan

我正在将 RGBA PNG 图片加载到 vulkan 中。我在这个过程中没有出现任何错误,但我的着色器向我显示了白色纹理。

我很快发现,如果将采样像素乘以 0.00390625(即 1/256),我就会得到正确的颜色。所以在这个过程中,vulkan 似乎只是将我的 8 位值复制到浮点版本而不进行转换。我缺少什么?

我在 GLSL 中使用组合图像采样器和使用 VK_FORMAT_R8G8B8A8_UINT 格式创建的图像。我不知道在哪里告诉 Vulkan 转换数据?

Jhe*_*ico 5

问题是,当您创建格式为 的图像时VK_FORMAT_R8G8B8A8_UINTUINT后缀明确告诉 Vulkan 您希望 RGBA 值在着色器中以 8 位无符号整数的形式出现。

相反,你真正想要的是VK_FORMAT_R8G8B8A8_UNORM。后缀UNORM告诉 Vulkan 获取 8 位并将其转换为[0, 1].

大多数常见格式都有尽可能多的后缀

  • _UNORM将数据转换为范围内的浮点数[0, 1]
  • _SNORM将数据转换为范围内的浮点数[-1, 1]
  • _USCALED将数据转换为浮点数而不更改值
  • _SSCALED将数据转换为浮点数而不更改值(但将输入视为有符号)
  • _UINT将值解释为无符号整数
  • _SINT将值解释为有符号整数

此外,对于足够宽以支持浮点值的格式,例如VK_FORMAT_R16G16B16A16_*and VK_FORMAT_R32G32B32A32_*then 后缀_SFLOAT也可用,告诉 Vulkan 通道中的值已经是浮点。没有UFLOAT,因为不支持无符号浮点数。

在处理从某些本地文件加载到 RGB 缓冲区的图像数据时,十有八九,您需要_UNORM发送到驱动程序的任何格式的版本,以便自动将值缩放到适当的浮点[0, 1]范围。