Я хочу представить визуальные стимулы на экране с линейными значениями яркости. Значение 0,5 должно иметь половину яркости, чем значение 1,0.
Сначала я измерил значение гаммы экрана с помощью колориметра.
Затем я вычисляю стимулы в металлическом представлении. Я вычисляю значение цвета (r, g, b, alpha) для каждой точки. В последней строке ядра я использую значение гаммы, измеренное для «корректировки» значения яркости при написании текстуры:
output.write(pow(color, 1 / gamma), gid);
Если я хочу нарисовать какие-то простые вещи, такие как метки или тексты, за пределами металлического представления, я могу изменить цвет, используя ту же идею:
color = pow(color, 1 / gamma)
Оба случая работают нормально, но я не могу наложить текст на металлический вид, если значение альфа отличается от единицы, потому что я больше не нахожусь в линейном пространстве.
Есть ли способ изменить цвет всех элементов на экране после того, как все виды смешаны?
Это для iOS. Но проблема в том, что я хочу отображать линейный RGB, потому что это приложение предназначено для научных визуальных экспериментов. Металлический вид работает с линейной RGB-подсветкой, но когда вычисления выполнены, изображение преобразуется с применением гаммы, чтобы соответствовать нелинейной реакции наших глаз на яркость. Это последнее преобразование - то, чего я хочу избежать, мое решение включало 1 / гамму, чтобы компенсировать это окончательное преобразование. Полагаю, мне придется делать все, включая рендеринг текстов внутри mtkview.





Теоретически, если вы переводите свой цвет в откалиброванное цветовое пространство (независимо от того, какое из них), цвета находятся в пределах цветового пространства и гаммы дисплея, и ваш дисплей правильно откалиброван, он должен работать автоматически, верно? Металл всегда работает с линейным RGB внутри шейдеров, так что учтите это. Кроме того, это macOS или iOS? Для macOS вы можете установить цветовое пространство окон.