Почему цветовые векторы не состоят из float4 вместо int4 или byte4?

Значения RBG составляют 0-255 целых чисел, так почему же float4 был выбран в качестве типа векторных данных?

Мне кажется, что байт был бы идеальным типом данных для цвета в Fuse.

2 ответа

Значения RGB являются только однобайтовыми (0-255) значениями в некоторых контекстах. Обычно используются многочисленные цветовые пространства, которые используют больше или меньше 1 байта для представления цветов (например, компактные 8-битные и 16-битные цветовые пространства или HDR-цвета, использующие 16 или даже 32 бита на канал). Это не просто теоретическое использование, когда они используются для изображений и текстур GL.

Важно то, что каждое из них представляет диапазон значений от 0, без интенсивности, до 1, полную интенсивность для этого канала. Вот почему float используется: это правильный семантический тип для представления нормализованного диапазона. Также это то, что OpenGL, графический интерфейс по умолчанию для Fuse, использует для представления цветов.

float имеет преимущество в том, что непрерывное значение, в отличие от byte который имеет дискретные приращения. Это важно для интерполяции. Рассмотрите анимацию между двумя цветами: линейный градиент, изменение непрозрачности или уменьшение насыщенности; все это должно быть сделано в непрерывном диапазоне значений, таком как float.

float также позволяет значениям становиться около 1 и ниже 0. Хотя они не могут быть отражены в конечном отображении, они играют роль во время вычислений. Если вы выполняете много операций с цветом последовательно, вы не хотите преждевременно фиксировать свои значения.

Не беспокойтесь о таких вещах, как пропускная способность памяти или объем памяти. Фактические сохраненные значения цвета - это незначительная часть того, что занимает память.

Кроме того, общие шестнадцатеричные синтаксисы для цветовой нотации поддерживаются в Fuse. Вы можете использовать простой #FAA для светло-красного или #AB74FD80 для более точного полупрозрачного цвета.

Сначала я собираюсь предположить, что под float вы подразумеваете 4-байтовое значение.

  • Четыре поплавка занимают в 4 раза больше памяти. Это важно не только для места, но и количества времени, которое требуется для перемещения памяти, поскольку пропускная способность памяти ограничена.
  • Вы не можете использовать операторы битовой маски и сдвигать на числах с плавающей точкой (ну, вы можете, но это не распространено).
  • Большинство технологий отображения ограничено 16M цветами, что составляет 24-битный RGB. Даже если у вас есть технология отображения 12-бит или 16-бит / канал, поплавки все равно занимают как минимум вдвое больше памяти.
  • Не все платформы даже имеют встроенную поддержку операций с плавающей запятой.

Я мог бы продолжать, но вы поняли идею.

Другие вопросы по тегам