归一化、缩放和整数 VkFormats 之间有什么区别?

What is the difference between normalized, scaled and integer VkFormats?

下面6个VkFormats为例:

VK_FORMAT_R8_UNORM
VK_FORMAT_R8_SNORM
VK_FORMAT_R8_USCALED
VK_FORMAT_R8_SSCALED
VK_FORMAT_R8_UINT
VK_FORMAT_R8_SINT

所有这些都指定了具有单个 8 位 R 分量的单分量 8 位格式。

格式的不同在于它们是否 (a) 标准化,(b) 缩放;或 (c) 整数。那是什么意思?这三样东西有什么区别?在哪里指定的?

8 位的所有 256 个可能值在所有六种格式中都有意义且有效吗?

(它们的区别还在于它们是 signed 还是 unsigned。我假设这意味着它们的基础类型是否类似于 C 类型int8_tuint8_t ?)

参考规范中的Identification of Formats and Conversion from Normalized Fixed-Point to Floating-Point

  • UNORM[0, 1] 范围内的 float
  • SNORM是一样的但是在[-1, 1]
  • 的范围内
  • USCALED是转换为float
  • 的无符号整数值
  • SSCALED是整数值转换为float
  • UINT 是无符号整数
  • SINT 是有符号整数

即对于 VK_FORMAT_R8_*:

  • for UNORM raw 0 会给出 0.0f,raw 255 会给出 1.0f
  • for SNORM raw -127 (resp. 129) 会给出 -1.0f, raw 127 会给出 1.0f
  • USCALED 原始 0 会给出 0.0f,原始 255 会给出 255.0f
  • SSCALEDraw -128 (resp. 128) 会给出 -128.0f,raw 127 会给出 127.0f

-128 (-2n-1) 在SNORM中没有意义,只是夹在-1.0f.