Parcourez les couleurs avec la même luminosité

8

D'accord. J'ai donc un jeu sur lequel je travaille avec un tas de particules colorées. Chacun d'eux a sa propre couleur mais ils sont tous proches d'une teinte spécifique.

Pour expliquer cela, j'utilise mieux l'espace colorimétrique HSV, et j'ai une variable globale qui passe de 0 à 360 (H) et chacune des particules spécifiques ajoute ou soustrait une quantité aléatoire de cela.

entrez la description de l'image ici J'utilise HSV parce que c'est le moyen le plus simple pour moi de faire défiler les couleurs car vous pouvez simplement changer H.

Cela a l'air très agréable et tout, mais les particules sont censées être de la lumière pure colorée. Pour le moment, ce ne sont que des cercles colorés avec l'ombre, mais plus tard, je pourrais ajouter des effets d'éclat et d'autres techniques d'ombrage.

Le problème est que toutes les nuances (je ne joue pas avec H ou V) ne sont pas égales en ce qui concerne la luminosité que nos yeux voient, ce qui pose des problèmes. Par exemple, quand tous sont des nuances de bleu, les choses semblent assez sombres.

Évidemment, dans le shader, je dois convertir ces couleurs HSV en couleurs RVB et en faisant quelques calculs, j'ai rapidement vu ce qui n'allait pas ... les couleurs n'avaient pas la même luminance!

Si je comprends bien, la luminance est à peu près (0.2126*color.r + 0.7152*color.g + 0.0722*color.b)ce qui explique pourquoi tout est éteint.

Est-ce un moyen de l'obtenir pour que je puisse toujours obtenir tous les différents chrominances (couleurs sur les degrés des roues) tout en maintenant une luminance élevée? Peut-être devrais-je travailler avec un type de couleur différent de HSV, ou peut-être que leur formule trouve une couleur au degré x sur la roue chromatique avec une luminance de y?

Merci beaucoup!

J.Doe
la source
Il y a malheureusement des limites à cela. Si vous regardez un espace colorimétrique perceptuellement uniforme comme le système de couleurs Munsell, vous verrez que le jaune vif a une valeur perçue beaucoup plus élevée qu'un bleu fort . Cela signifie que si vous souhaitez conserver une valeur / luminance perçue uniforme, vous pouvez obtenir soit un bleu royal riche associé à une ocre sombre dans la teinte jaune, soit un jaune vif avec un bleu bébé pâle. Quoi qu'il en soit, vous sacrifiez une certaine saturation quelque part dans la roue chromatique.
DMGregory
1
Comme vous l'avez noté, RGB et HSL sont conçus autour des couleurs d'écran possibles et non autour des yeux humains. Jetez un oeil à HUSL et HCL . Parfois, j'utilise aussi L * a * b * .
amitp
@amitp ces espaces colorimétriques semblent être relativement nouveaux et je vois une certaine différence dans la façon dont ils sont définis et comment ils sont convertis. Quelle source serait la plus fiable pour cela?
J.Doe
Je suis dans un bus, donc je ferais mieux de ne pas écrire de réponse formelle, mais voici ce qui se cache sous le problème: vous allez devoir résoudre un système d'équations où vous branchez trois variables: Teinte, Luminance et Saturation. Donc, ici, vous recherchez une valeur spécifique, étant donné H et S, qui remplit la condition d'avoir une certaine luminance. Pas tout à fait dur. Mais vous découvrirez bientôt que certaines couleurs ne peuvent pas devenir aussi lumineuses que certaines (essayez de trouver un bleu aussi lumineux qu'un jaune 100 V), donc vous voudrez peut-être restreindre les valeurs, afin d'obtenir des valeurs représentables à l'écran.
Gustavo Maciel
Oui, j'ai travaillé là-dessus. J'ai une formule récursive en cours ... ET une formule non récursive (qui ne fonctionne pas tout à fait).
J.Doe

Réponses:

2

HCY pourrait être mieux adapté à vos besoins. Selon la page HSL et HSV de Wikipedia , le problème que vous rencontrez avec HSV - que le même "V" avec des teintes différentes ne correspond pas à la perception humaine - est similaire avec HSL, mais HCY pourrait répondre à vos besoins - le "Y" dans HCY est pour "luma":

La luma est à peu près similaire [en termes de légèreté à l'image couleur d'origine], mais diffère quelque peu avec une chrominance élevée. HSL L et HSV V, en revanche, s'écartent sensiblement de la légèreté perceptuelle.

HCY est décrit dans la page Wikipedia comme "luma / chroma / hue". Cette page , d'autre part, semble utiliser le raccourci "HCY" et montre comment le convertir vers et depuis RVB.

Jibb Smart
la source
2
Votre suggestion de division alternative ne fonctionnera pas pour des couleurs comme le bleu (0, 0, 1) - car nous pouvons finir par saturer la gamme de nos primaires avant d'atteindre la luma souhaitée. Un phosphore bleu sur l'écran du lecteur ne peut pas être arbitrairement éclairé (bien que le HDR puisse atténuer le reste de l'écran pour essayer de donner l'illusion que le bleu est aussi brillant. Ou vous pouvez définir votre objectif de luma à 0,0722 pour pouvoir divisez n'importe quelle couleur en cette luma, au prix de couleurs très foncées dans l'ensemble)
DMGregory
Bon point. Je vais améliorer cette partie de la réponse.
Jibb Smart
Il existe de nombreuses façons d'améliorer la suggestion alternative, mais cela devient assez complexe avant d'obtenir réellement le type de résultats que OP souhaite probablement, j'ai donc supprimé mon alternative. HCY devrait suffire.
Jibb Smart
Je fais une expérimentation avec tout cela. Je mettrai à jour dans quelques jours pour voir comment ces espaces colorimétriques se produisent. Merci beaucoup les gars!
J.Doe
@DMGregory pourriez-vous s'il vous plaît expliquer plus ce que vous entendez par "définir votre objectif de luma à 0,0722 pour pouvoir diviser n'importe quelle couleur à cette luma, au prix de couleurs très sombres dans l'ensemble"?
J.Doe