Recorrer los colores con el mismo brillo.

8

Okay. Así que tengo un juego en el que estoy trabajando con un montón de partículas de colores. Cada uno de ellos tiene su propio color, sin embargo, todos están cerca de un tono específico.

Para explicar eso mejor, estoy usando el espacio de color HSV, y tengo una variable global que va de 0 a 360 (H) y cada una de las partículas específicas suma o resta una cantidad aleatoria de eso.

ingrese la descripción de la imagen aquí Utilizo HSV porque es la forma más fácil para mí de recorrer los colores porque puedes cambiar H.

Esto se ve muy bien y todo, sin embargo, se supone que las partículas son luz pura coloreada. En este momento, todos son círculos coloreados con la sombra, pero más tarde podría agregar efectos de brillo y otras técnicas de sombreado.

El problema es que no todos los tonos (no me meto con H o V) son iguales en cuanto al brillo que ven nuestros ojos, y esto causa problemas. Por ejemplo, cuando todos ellos son tonos de azul, las cosas se ven bastante oscuras.

Obviamente, en el sombreador, tengo que convertir estos colores HSV a colores RGB y, haciendo algunos cálculos, rápidamente vi lo que estaba mal ... ¡los colores no tenían la misma luminosidad!

Según tengo entendido, la luminancia es más o menos, (0.2126*color.r + 0.7152*color.g + 0.0722*color.b)por eso todo está apagado.

¿Es su forma de obtenerlo para que pueda obtener todos los diferentes croma (colores en los grados de las ruedas) mientras mantengo una alta luminosidad? ¿Tal vez debería trabajar con un tipo de color diferente al HSV, o tal vez sea una fórmula que encuentre un color en grado x en la rueda de colores con luminancia de y?

¡Muchas gracias!

J.Doe
fuente
Hay límites para esto desafortunadamente. Si observa un espacio de color perceptualmente uniforme como el sistema de color Munsell, verá que el amarillo brillante tiene un valor percibido mucho más alto que un azul fuerte . Esto significa que si desea mantener uniforme el valor percibido / luminancia, entonces se puede obtener ya sea un rico azul real se combina con un color ocre oscuro en el tono amarillo, o de un color amarillo brillante con azul pálido bebé. De cualquier manera, sacrificas algo de saturación en algún lugar de la rueda de colores.
DMGregory
1
Como notó, RGB y HSL están diseñados alrededor de posibles colores de pantalla y no alrededor de los ojos humanos. Echa un vistazo a HUSL y HCL . A veces también uso L * a * b * .
amitp
@amitp esos espacios de color parecen ser bastante nuevos y veo alguna diferencia en cómo se definen los espacios de color y cómo se convierten. ¿Qué fuente sería la más confiable para esto?
J.Doe
Estoy en un autobús, por lo que es mejor que no escriba una respuesta formal, pero esto es lo que subyace al problema: tendrá que resolver un sistema de ecuaciones donde conecte tres variables: Hue, Luminance y Saturation. Entonces, aquí está buscando un valor específico, dado H y S, que cumpla con la condición de tener cierta luminancia. No del todo difícil. Pero pronto descubrirá que algunos colores no pueden ser tan luminosos como otros (intente encontrar un azul tan luminoso como un amarillo de 100V), por lo que es posible que desee fijar los valores para obtener valores representables en la pantalla.
Gustavo Maciel
Sí, he estado trabajando en eso. Obtuve una fórmula recursiva ... Y una no recursiva (eso no funciona del todo).
J.Doe

Respuestas:

2

HCY podría ser mejor para sus necesidades. De acuerdo con la página HSL y HSV de Wikipedia , el problema que tiene con HSV, que la misma "V" con diferentes tonos no corresponde a la percepción humana, es similar con HSL, pero HCY podría satisfacer sus necesidades: "Y" en HCY es para "luma":

Luma es más o menos similar [en ligereza a la imagen de color original], pero difiere un poco con un alto croma. HSL L y HSV V, por el contrario, divergen sustancialmente de la ligereza perceptiva.

HCY se describe en la página de Wikipedia como "luma / chroma / hue". Esta página , por otro lado, parece usar la abreviatura "HCY" y muestra cómo convertirla hacia y desde RGB.

Jibb Smart
fuente
2
Su sugerencia de división alternativa no funcionará para colores como el azul (0, 0, 1), porque podemos terminar saturando el rango de nuestras primarias antes de alcanzar la luma deseada. Un fósforo azul en la pantalla del jugador no puede ser conducido arbitrariamente brillante (aunque HDR podría atenuar el resto de la pantalla para tratar de dar la ilusión de que el azul es tan brillante. O podría establecer su objetivo de luma en 0.0722 para poder dividir cualquier color a esa luma, a costa de los colores muy oscuros en general)
DMGregory
Buen punto. Mejoraré esa parte de la respuesta.
Jibb Smart
Hay muchas maneras de mejorar la sugerencia alternativa, pero se vuelve bastante compleja antes de obtener el tipo de resultados que OP probablemente quiere, así que eliminé mi alternativa. HCY debería ser suficiente.
Jibb Smart
Estoy experimentando un poco con todo esto. Estaré actualizando en un par de días para ver cómo se forman estos espacios de color. Muchas gracias chicos!
J.Doe
@DMGregory ¿podría explicar más sobre lo que quiere decir con "establecer su objetivo de luma en 0.0722 para poder dividir cualquier color en esa luma, a costa de los colores muy oscuros en general"?
J.Doe