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 double
para colores es una exageración masiva, pero usar float
para la representación interna de colores es común por todas las razones anteriores. Cuando se trabaja con GPU, half
también es común (flotante de 16 bits), ya que admiten ese formato en hardware.
half
no 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