Сколько точности (половина, float, double и т. Д.) Достаточно для класса Color?

8

Читая о том, как приложения реального времени обрабатывают цвет в OpneGL, я заметил, что некоторые примеры реализовали Color как набор из 4 floats, а другие использовали 4 doubles. Я даже видел несколько примеров сжатия вершин в области разработки игр, которые рекомендовали сохранять цвета как 4 short.

Все это заставило меня стремиться узнать больше об этом: какова предельная точность, которую OpenGl (или аппаратные средства) обрабатывают для цветов? Более важно, однако, каковы пределы точности, выше которых цветовые различия становятся невозможными заметить?

У меня сложилось впечатление, что более тщательное изучение этого поможет мне лучше подумать и решить, как реализовать класс Color для различных приложений и сценариев (например, выбор компромисса между памятью, скоростью и разнообразием цветов).

Спасибо за ваши идеи по этому поводу.

AndrewSteer
источник

Ответы:

6

Цвета, отображаемые на дисплее или сохраненные в стандартных форматах файлов изображений, используют 8 бит на компонент. Поэтому для хранения этих цветов достаточно использовать четыре байта ( unsigned char). Эти цвета обычно используют цветовое пространство sRGB , которое включает в себя нелинейное «гамма-преобразование», которое перераспределяет точность, чтобы сделать ее несколько более воспринимаемой однородной, так что на самом деле это довольно близко к пределу того, насколько тонко люди уже могут воспринимать цветовые различия. (Однако гамма sRGB является лишь подмножеством всех цветов, которые физически воспринимаются. Более широким гаммам нужно больше битов.)

Однако, если вы генерируете или обрабатываете цвета в графическом программном обеспечении (а не просто загружаете / сохраняете их), существуют различные причины, по которым вам может потребоваться более высокая точность.

  • Выполнение операций с цветами, таких как регулировка яркости и контрастности, альфа-смешение, гамма-коррекция и т. Д., Как правило, приводит к потере точности. Возможно, вы захотите хранить цвета как 16-битные или более для внутреннего использования, чтобы обеспечить себе больше точности. В противном случае повторное округление до 8 битов после каждой операции может привести к постепенной потере качества.
  • Аналогично, при работе с линейными цветами (а не цветами sRGB с гамма-кодированием) для освещения математики требуется дополнительная точность, чтобы обеспечить достаточную точность при конечном преобразовании обратно в sRGB.
  • Может быть быстрее и удобнее работать с цветами с плавающей точкой вместо целых. Это особенно верно для графических процессоров, где целочисленные математические инструкции имеют лишь небольшую часть пропускной способности команд с плавающей запятой. Но даже на процессорах гораздо проще и, вероятно, быстрее преобразовать цвета в плавающие, выполнить несколько операций, а затем преобразовать обратно в целое число, а не пытаться делать все с помощью целочисленной математики с фиксированной точкой.
  • Если вы вообще делаете HDR- рендеринг, вам потребуется более 8 бит точности для обработки большей цветовой гаммы и диапазона интенсивности. Новые HDR-дисплеи только начинают выходить, принимают изображения с 10 или 12 битами на компонент.

Использование doubleдля цветов является чрезмерным излишним, но использование floatдля внутреннего представления цветов является общим по всем причинам, указанным выше. При работе с графическими процессорами half(16-разрядное число с плавающей запятой) также распространено, поскольку они поддерживают этот формат на аппаратном уровне.

Натан Рид
источник
Отличный ответ, спасибо! Я просто не получил последнюю часть: использование halfне приведет к тем же проблемам, о которых вы упоминали ранее, из-за отсутствия точности? Я думаю, что это было бы особенно важно в графическом процессоре из-за множества вычислений цвета, которые часто выполняются в шейдерах
AndrewSteer
1
@AndrewSteer A half- 16 бит, включая 11 эффективных битов точности мантиссы, поэтому, хотя он и не такой точный float, его все же достаточно для большинства операций с цветом. (Может быть , не совсем , достаточно , если вы выводите на дисплей высокой цветовой гаммы , HDR я не уверен.)
Натан Рид