Изображениями с широким динамическим диапазоном уже никого не удивишь. Наверное каждый хотя бы раз в своей жизни пробовал создать HDR фотографию. Однако мало кто знает, что в индустрии кино эта технология используется уже больше десяти лет, и все рабочие процессы конвейера, начиная от создания текстур и заканчивая рендерингом готовой сцены, тесно связаны с работой в линейных цветовых пространствах, представленных числами с плавающей запятой.
В этой статье я постараюсь рассказать, что такое сцено-ориентированный рабочий процесс менеджмента цвета, зачем нужна библиотека OpenColorIO, а также о том, как настроить работу в окружении OpenColorIO в свободном графическом редакторе для художников Krita.
Что такое OpenColorIO?
OpenColorIO (OCIO) — это библиотека, обеспечивающая работу с цветом в индустрии кино. В частности, она использовалась при создании фильмов Человек-паук 2 (2004) и Алиса в стране чудес (2010). OpenColorIO предназначена для преобразования всех цветовых пространств, которые встречаются по ходу продвижения изображения по конвейеру.
Пример. Текстурировщик создал текстуру в цветовом пространстве sRGB, 8-бит на канал. При движении дальше по конвейеру текстура попадает к моделлеру, который, чтобы наложить ее на модель, переводит ее в линейный RGB, 16-бит с плавающей запятой. Рендеринг сцены происходит опять же в линейном RGB, 32-бит с плавающей запятой, и конечный результат переводится обратно в sRGB8, чтобы его можно было показать на стандартном мониторе.
Очевидно, что все эти преобразования должны как-то описываться. Более того, желательно, чтобы они описывались централизованно, ведь над одним фильмом может работать не просто несколько человек, а несколько команд или даже компаний, в каждой из которых свои правила и стандарты. Эту задачу как раз и решает OpenColorIO.
Все параметры рабочего процесса в OpenColorIO определяет т.н. кофигурация, которая обычно представляет собой просто каталог с текстовым файлом config.ocio
и файлами таблиц преобразования цвета (look-up table, LUT). В файле конфигурации описываются все преобразования между цветовыми пространствами, использующимися в конвейере. Так что чтобы обеспечить единообразную работу с цветом для всех исполнителей, будет достаточно разослать им эту конфигурацию и попросить прописать путь к ней в переменной окружения $OCIO
. Все поддерживающие OCIO приложения прочитают эту переменную и автоматически будут использовать правильные настройки.
Примеры конфигураций можно найти на официальном сайте.
Почему не ICC?
Многие, вероятно, уже задались вопросом, зачем нужен этот OpenColorIO, когда есть механизм ICC-профилей, стандартизированный Международным Консорциумом по Цвету?
В случае же с процессом создания кино все выглядит несколько по-другому. Задача связать разные устройства вывода отходит на второй план (с профилированием мониторов в профессиональной студии уж как-нибудь да справятся), однако появляется новое требование: преобразования должны проходить без потерь. Более того, для них должны существовать обратные преобразования, которые также не приводят к искажениям. Действительно, рассмотрим простой пример. После сканирования с пленки мы получаем файл в логарифмическом цветовом пространстве, затем преобразуем его в линейное, чтобы выполнить композитинг, а после, чтобы отобразить на мониторе применяем обратное преобразование с показателем степени 2.2. Очевидно, что при таких преобразованиях, погрешности в светах на 1 бит (244<->255) после применения степенной функции приведут к хорошо заметным артефактам при просмотре.
Здесь на сцену и выходит OpenColorIO с его централизацией. Все цветовые пространства, с которыми будут работать на каждом этапе создания фильма проектируются до старта работ. Преобразования между ними выбираются взаимно однозначными так, чтобы изображение могло без потерь передвигаться как вдоль конвейера, так и в обратную сторону. Эти преобразования задаются напрямую, без использования привязок к эталонным пространствам L*a*b или CIE XYZ, которые моментально привнесли бы множество проблем (как минимум, постоянная конвертация значения белой точки туда-обратно, для L*a*b и CIE XYZ она определена стандартом — D50). Так что преобразования в OpenColorIO получаются проще и зачастую описываются простыми математическими выражениями.
Таким образом, готовая конфигурация OpenColorIO определяет закрытое множество цветовых пространств, в которых могут работать исполнители и гарантированно получить качественный результат. В некотором роде меньшая универсальность и сложность добавления нового пространства выполняет роль ограничителя и ограждает исполнителей от использования непроверенных цветовых пространств.
В какой-то степени OpenColorIO принадлежит более низкому уровню абстракций, нежели ICC, примерно как ассемблер находится ниже языков высокого уровня. Точно так же художник, используя OpenColoIO, получает гораздо больше возможностей, недоступных в высокоуровневых инструментах. Конечно, ценою больших знаний и некоторого усложнения используемых концепций.
Scene-referred vs. output-referred workflow
Большинство людей привыкли считать, что ICC-профили и вся эта затея с менеджментом цвета нужна лишь для того, чтобы правильно вывести файл на принтер (минилаб, типографию). В целом, они правы. Такой рабочий процесс, когда файл готовится к конкретному устройству вывода обычно называют устройство-ориентированным (output-referred workflow). Однако что делать, если ваша картинка будет в итоге выведена на множество носителей? К примеру, сцена из фильма будет выведена как минимум на монитор, проектор и пленку. У каждого из устройств свои характеристики, своя гамма и свой динамический диапазон. Какое рабочее пространство выбрать и как с ним работать?
Чтобы решить эту проблему, при создании фильмов пошли другим путем. Вся работа происходит в линейном RGB пространстве с неограниченным динамическим диапазоном (значения RGB каналов могут легко превышать 1.0). Рендеринг, генерация спецэффектов, все происходит в этом искусственном пространстве, и лишь на финальной стадии проекта, когда нужно вывести изображение на конкретное устройство, его приводят к стандартному диапазону 0.0...1.0 (сжимают или обрезают) и отправляют на устройство. Такой рабочий процесс называется сцено-ориентированным (scene-referred).
Возможности Криты по работе с цветом
Крита поддерживает работу как в устройство-ориентированным, так и сцено-ориентированном рабочем процессе. При этом поддерживается работа как с ICC-профилями, так и с глобальными настройками OpenColorIO. Далее рассмотри оба варианта настройки Криты.
Подключение данных о калибрации и профилировании монитора к Крите (ICC-профиль)
При отключенном OCIO или если OCIO работает в режиме Internal
, для рендеринга изображения на экране Крита использует ICC-профиль, указанный в настройках (или полученный от X-сервера). Чтобы получить точное воспроизведение цветов, необходимо выполнить несколько несложных шагов:
- Откалибровать монитор и построить его профиль. Под Linux это можно сделать с помощью
dispcalGUI
(проверено с X-Rite i1Display 2) На выходе будет получен ICC-профиль. - Загрузить VCGT-tag (Video Card Gamma Table), хранящийся в ICC профиле, в LUT видеокарты. Под Linux это можно сделать программами
xcalib
илиdispwin
. Под Windows достаточно выбрать его в системных настройках. На этом этапе монитор станет откалиброванным, но данные профилирования еще не будут активны. - Выбрать профиль монитора в настройках Криты:
Preferences->Color Management
.
Теперь цвет всех изображений будет отображаться корректно.
Создание конфигурации OpenColorIO с данными о профиле монитора
Одним из преимуществ OpenColorIO для нас является то, что при его использовании становится возможным перенести вычисления, связанные с цветом на GPU, тем самым значительно ускорив рендеринг. Далеко не факт, что обычным пользователям понадобится создавать и описывать свои собственные цветовые пространства, но вот ускорение работы понадобится точно. В качестве примера создадим конфигурацию, которая будет учитывать данные о профилировании монитора.
Работа с OpenColorIO несколько сложнее, чем с ICC, т.к. нужно явно создавать преобразование для каждого входного цветового пространства, которое мы будем использовать. Создадим преобразование, которое бы конвертировало цвета из sRGB в пространство монитора.
Для этого нам нужно создать 3D LUT таблицу этого преобразования. В dispcalGUI
выбираем Tools->Create 3D LUT
, в качестве исходного пространства выберем sRGB, в качестве целевого — ICC-профиль монитора. Полученный файл сохраняем в подкаталог luts
тестовой конфигурации под именем srgb_to_monitor.3dl
. Теперь, при активации этой конфигурации, цветовое пространство изображения будет преобразовываться в пространство монитора средствами OpenColorIO. Если активен режим openGL, то все вычисления будут проходить на GPU.
Рисование HDR изображений в Крите
Обычный монитор явно не является HDR устройством, поэтому для отображения на экране и редактирования файла с широким динамическим диапазоном используются специальные уловки. Художник, работая с произведением, может выбирать, с какой частью диапазона он хочет работать в данный момент. Для этого у него имеются настройки Экспозиции
и Гамма-коррекции
, которые применяются только при рендеринге на дисплее и никак не влияют на данные, хранящиеся в файле. Изменение экспозиции сжимает или наоборот растягивает диапазон, а изменение значения гаммы, меняет крутизну кривой преобразования. Изменять текущее значение экспозиции можно простым жестом: для этого достаточно зажать клавишу 'Y' и потянуть мышью за холст. Экспозиция будет меняться динамически. Аналогичный жест можно назначить и для изменения гаммы.
Особенностью Криты является то, что в ней инструменты выбора цвета в курсе обо всех преобразованиях, которые происходят с изображением перед тем, как оно отрисуется на дисплее. Поэтому цвета в панелях выбора цвета отображаются именно так, как они будут выглядеть при рисовании, какими бы не были настройки экспозиции, гаммы и цветовых пространств на данный момент. Более того, при изменении настроек отображения, Крита будет пытаться откорректировать текущий цвет рисования таким образом, чтобы при новый настройках он выглядел точно так же, как и при предыдущих, и пользователь мог продолжить рисовать тем же цветом. Это не всегда возможно, поскольку зачастую преобразование в цветовое пространство монитора необратимо. В таких случаях, при изменении настроек экспозиции и гаммы вы увидите, как текущий выбранных цвет немного меняется.
Таким образом, Крита позволяет рисовать изображение, никак не задумываясь о текущем значении экспозиции. Просто меняем текущий диапазон жестом и рисуем.
Бонус для дочитавших до конца:
HDR пейзаж от Wolthera van Hövell tot Westerflier
HDR сцена от Timothée Giet
Вместо заключения
В этой статье я попытался рассказать, какие методы работы с изображениями используют в индустрии кино и какой функционал по поддержке этих процессов предлагает Крита.
Этот функционал был добавлен в основную ветку совсем недавно и многие вещи требуют улучшения в плане удобства работы для пользователя. Мы работаем над этим и принимаем любые пожелания по этому поводу.
Автор: dkazakov-dev