¿Cuánta precisión (media, flotante, doble, etc.) es suficiente para una clase de color?

8

Mientras leía un poco sobre cómo las aplicaciones en tiempo real manejan el color en OpneGL, noté que algunos ejemplos implementaron Color como una colección de 4 floats, mientras que otros usaron 4 doubles. Incluso he visto algunos ejemplos de compresión de vértices en el campo de desarrollo del juego que abogaban por guardar los colores como 4 short.

Todo esto me puso ansioso por aprender más sobre esto: ¿cuál es la precisión límite que maneja OpenGl (o hardware) para los colores? Más importante aún, ¿cuáles son los límites de precisión por encima de los cuales las diferencias de color se vuelven imposibles de notar?

Tengo la impresión de que aprender más sobre eso me ayudaría a pensar y decidir mejor cómo implementar una clase de Color para diferentes aplicaciones y escenarios (por ejemplo, tomar decisiones de compensación entre memoria, velocidad y variedad de colores).

Gracias por tus ideas sobre esto.

AndrewSteer
fuente

Respuestas:

6

Los colores que se muestran en la pantalla o guardados en formatos de archivo de imagen estándar utilizan 8 bits por componente. Por lo tanto, para almacenar estos colores es suficiente usar cuatro bytes ( unsigned char). Estos colores usualmente usan el espacio de color sRGB , que incluye una transformación "gamma" no lineal que redistribuye la precisión para hacerlo algo más perceptualmente uniforme, por lo que en realidad está bastante cerca del límite de cómo los humanos pueden percibir diferencias de color. (Sin embargo, la gama sRGB es solo un subconjunto de todos los colores que son físicamente perceptibles. Las gamas más amplias necesitan más bits).

Sin embargo, si está generando o procesando colores en software de gráficos (y no solo cargándolos / almacenándolos), hay varias razones por las que es posible que desee usar más precisión.

  • Realizar operaciones en colores, como ajustar el brillo y el contraste, la combinación alfa, la corrección gamma, etc., todo tiende a perder precisión. Es posible que desee almacenar colores de 16 bits o más internamente para tener más margen de precisión. De lo contrario, el redondeo repetido a 8 bits después de cada operación puede causar una pérdida progresiva de calidad.
  • Del mismo modo, cuando se trabaja con colores lineales (no los colores codificados con gamma sRGB) para la iluminación matemática, se necesita una precisión adicional para garantizar que tenga la precisión suficiente cuando finalmente vuelva a convertir a sRGB.
  • Puede ser más rápido y más conveniente trabajar con colores de punto flotante en lugar de colores enteros. Esto es especialmente cierto en las GPU, donde las instrucciones matemáticas enteras tienen solo una fracción del rendimiento de las instrucciones flotantes. Pero incluso en las CPU es ciertamente más fácil y probablemente más rápido convertir colores a flotantes, realizar un montón de operaciones y luego volver a convertir a entero, en lugar de intentar hacer todo con matemática de punto fijo entero.
  • Si hace renderizado HDR , necesitará más de 8 bits de precisión para manejar la gama de colores y el rango de intensidad más grandes. Las nuevas pantallas HDR que recién comienzan a salir aceptan imágenes con 10 o 12 bits por componente.

Usar doublepara colores es una exageración masiva, pero usar floatpara la representación interna de colores es común por todas las razones anteriores. Cuando se trabaja con GPU, halftambién es común (flotante de 16 bits), ya que admiten ese formato en hardware.

Nathan Reed
fuente
Excelente respuesta, gracias! Simplemente no obtuve la última parte: ¿usar un halfno incurriría en los mismos problemas que mencionó antes, debido a la falta de precisión? Pensé que eso sería particularmente importante en la GPU, debido a los muchos cálculos de color que se realizan con frecuencia en los sombreadores
AndrewSteer
1
@AndrewSteer A halftiene 16 bits, incluidos 11 bits efectivos de precisión de mantisa, por lo que, aunque no es tan preciso float, sigue siendo suficiente para la mayoría de las operaciones de color. (Tal vez no bastante , suficiente si estás dar salida a una pantalla de alta gama HDR no estoy seguro.)
Nathan Reed