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

And*_*zos 9 vulkan

我们以下面的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
Run Code Online (Sandbox Code Playgroud)

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

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

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

(它们的不同之处还在于它们是signed还是unsigned。我认为这意味着它们的底层类型是像 C 类型int8_t还是uint8_t?)

krO*_*oze 13

请参阅规范中的格式识别从规范化定点到浮点的转换

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

即对于VK_FORMAT_R8_*

  • 因为UNORMraw0会给予0.0f, raw255会给予1.0f
  • 对于SNORMraw -127(resp. 129) 会给予-1.0f, raw127会给予1.0f
  • USCALED0会给予0.0f,生255会给予255.0f
  • SSCALEDraw -128(resp. 128) 会给予-128.0f, raw127会给予127.0f

-128(-2 n-1 ) 在 中没有意义SNORM,只是简单地钳制到-1.0f