归一化、缩放和整数 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_t
或 uint8_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
SSCALED
raw -128
(resp. 128
) 会给出 -128.0f
,raw 127
会给出 127.0f
-128
(-2n-1) 在SNORM
中没有意义,只是夹在-1.0f
.
下面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_t
或 uint8_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
raw0
会给出0.0f
,raw255
会给出1.0f
- for
SNORM
raw-127
(resp.129
) 会给出-1.0f
, raw127
会给出1.0f
USCALED
原始0
会给出0.0f
,原始255
会给出255.0f
SSCALED
raw-128
(resp.128
) 会给出-128.0f
,raw127
会给出127.0f
-128
(-2n-1) 在SNORM
中没有意义,只是夹在-1.0f
.