Циклическое переключение цветов с одинаковой яркостью

8

Хорошо. Итак, у меня есть игра, над которой я работаю, с кучей цветных частиц. Каждый из них получает свой собственный цвет, но все они близки к определенному оттенку.

Чтобы объяснить это лучше, я использую цветовое пространство HSV, и у меня есть глобальная переменная, которая циклически изменяется от 0 до 360 (H), и каждая из конкретных частиц добавляет или вычитает случайное количество из этого.

введите описание изображения здесь Я использую HSV, потому что это самый простой способ для меня переключаться между цветами, потому что вы можете просто изменить H.

Это выглядит очень красиво и все, однако частицы должны быть чистого света, который окрашен. Прямо сейчас все они - круги, окрашенные в тень, но позже я мог бы добавить эффекты свечения и другие методы затенения.

Проблема в том, что не все оттенки (я не связываюсь с H или V) равны по яркости, которую видят наши глаза, и это вызывает проблемы. Например, когда все они оттенков синего, вещи выглядят довольно темными.

Очевидно, что в шейдере мне нужно преобразовать эти цвета HSV в цвета RGB, и, выполнив некоторые математические расчеты, я быстро понял, что не так ... цвета не имели одинаковой яркости!

Насколько я понимаю, яркость примерно, (0.2126*color.r + 0.7152*color.g + 0.0722*color.b)поэтому все выключено.

Является ли это способом получить его, чтобы я мог получать все различные цветовые оттенки (цвета на колесах), сохраняя высокую яркость? Возможно, мне следует работать с цветом другого типа, чем HSV, или, может быть, это формула, которая находит цвет в степени x на цветовом круге с яркостью y?

Спасибо большое!

j.doe
источник
К сожалению, есть пределы этому. Если вы посмотрите на однородное по восприятию цветовое пространство, такое как цветовая система Манселла, вы увидите, что ярко-желтый имеет гораздо более высокое воспринимаемое значение, чем ярко-синий . Это означает, что если вы хотите сохранить равномерное воспринимаемое значение / яркость, то вы можете получить либо насыщенный королевский синий в сочетании с темной охрой в желтом оттенке, либо ярко-желтый с бледно-голубым. В любом случае вы жертвуете некоторым насыщением где-то в цветовом круге.
DMGregory
1
Как вы заметили, RGB и HSL созданы вокруг возможных цветов экрана, а не вокруг глаз человека. Посмотрите на HUSL и HCL . Иногда я тоже буду использовать L * a * b * .
amitp
@amitp эти цветовые пространства кажутся довольно новыми, и я вижу некоторую разницу в том, как они определяют цветовые пространства и как они преобразуются. Какой источник будет наиболее надежным для этого?
J.Doe
Я нахожусь в автобусе, поэтому мне лучше не писать формальный ответ, но вот что лежит в основе проблемы: вам нужно будет решить систему уравнений, в которой вы включите три переменные: оттенок, яркость и насыщенность. Итак, здесь вы ищете определенное значение, заданное H и S, которое соответствует условию наличия определенной яркости. Не совсем сложно. Но вскоре вы обнаружите, что некоторые цвета не могут быть такими же яркими, как некоторые (попробуйте найти синий, такой же яркий, как желтый 100 В), поэтому вы можете захотеть ограничить значения, чтобы получить значения, представимые на экране.
Густаво Масиэль
Да, я работал над этим. Я получил рекурсивную формулу ... И нерекурсивную (это не совсем работает).
J.Doe

Ответы:

2

HCY может быть лучше для ваших нужд. Согласно странице HSL и HSV в Википедии , проблема, с которой вы сталкиваетесь с HSV - то, что тот же «V» с разными оттенками не соответствует человеческому восприятию - похожа на HSL, но HCY может удовлетворить ваши потребности - «Y» в HCY для «luma»:

Luma примерно похожа [по яркости на исходное цветное изображение], но несколько отличается при высокой цветности. HSL L и HSV V, напротив, существенно отличаются от воспринимаемой легкости.

HCY описывается на странице Википедии как "luma / chroma / hue". С другой стороны, эта страница использует сокращение "HCY" и показывает, как преобразовать его в RGB и из него.

Jibb Smart
источник
2
Ваше альтернативное предложение о разделении не сработает для таких цветов, как синий (0, 0, 1) - потому что мы можем в итоге насытить диапазон наших праймериз, прежде чем достигнем желаемой яркости. Синий люминофор на экране плеера не может управляться произвольно ярко (хотя HDR может затемнить остальную часть экрана, чтобы создать иллюзию того, что синий цвет настолько яркий. Или вы можете установить целевую яркость на 0,0722, чтобы иметь возможность разделите любой цвет на эту яркость за счет очень темных цветов в целом)
DMGregory
Хорошая точка зрения. Я улучшу эту часть ответа.
Jibb Smart
Существует множество способов улучшить альтернативное предложение, но оно становится довольно сложным, прежде чем фактически получить тот результат, которого, вероятно, хочет ОП, поэтому я удалил свою альтернативу. HCY должно хватить.
Jibb Smart
Я делаю некоторые эксперименты со всем этим. Я буду обновлять через пару дней, чтобы увидеть, как преформ эти цветовые пространства. Большое спасибо, ребята!
J.Doe
@DMGregory Не могли бы вы объяснить подробнее, что вы подразумеваете под «установкой целевого значения яркости на 0,0722, чтобы можно было разделить любой цвет на эту яркость за счет очень темных цветов в целом»?
J.Doe