В чем разница между нормализованными, масштабированными и целочисленными VkFormats? - PullRequest
1 голос
/ 07 января 2020

Возьмем, к примеру, следующие 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-битный формат, который имеет один 8-битный компонент R.

Форматы различаются в зависимости от того, являются ли они (а) нормализованными , (b) масштабированными ; или (c) целое число . Что это обозначает? Каковы различия между этими тремя вещами? Где это указано?

Являются ли все 256 возможных значений 8-битных значимыми и действительными во всех шести форматах?

(Они также различаются в том, являются ли они со знаком или unsigned . Я предполагаю, что это означает, что их базовые типы похожи на C types int8_t или uint8_t?)

1 Ответ

5 голосов
/ 07 января 2020

См. Идентификация форматов и Преобразование из нормализованной фиксированной точки в плавающую точку в спецификации.

  • UNORM является float в диапазоне [0, 1].
  • SNORM - то же самое, но в диапазоне [-1, 1]
  • USCALED - целое число без знака, преобразованное в float
  • SSCALED - целочисленное значение, преобразованное в float
  • *, 1025 * - целое число без знака
  • SINT - целое число со знаком

Т.е. для VK_FORMAT_R8_*:

  • для UNORM raw 0 даст 0.0f, raw 255 даст 1.0f
  • для SNORM raw -127 (соответственно 129) даст -1.0f, raw 127 даст 1.0f
  • USCALED raw 0 даст 0.0f, raw 255 выдаст 255.0f
  • SSCALED raw -128 (соответственно 128) выдаст -128.0f, raw 127 выдаст 127.0f

-128 (-2 n-1 ) не имеет смысла в SNORM, а просто ограничивается -1.0f.

...