OpenColorIO и Krita: обработка и рисование HDR изображений

в 13:43, , рубрики: open source, opensource, Анимация и 3D графика, Работа с видео, метки:

Изображениями с широким динамическим диапазоном уже никого не удивишь. Наверное каждый хотя бы раз в своей жизни пробовал создать HDR фотографию. Однако мало кто знает, что в индустрии кино эта технология используется уже больше десяти лет, и все рабочие процессы конвейера, начиная от создания текстур и заканчивая рендерингом готовой сцены, тесно связаны с работой в линейных цветовых пространствах, представленных числами с плавающей запятой.

В этой статье я постараюсь рассказать, что такое сцено-ориентированный рабочий процесс менеджмента цвета, зачем нужна библиотека OpenColorIO, а также о том, как настроить работу в окружении OpenColorIO в свободном графическом редакторе для художников Krita.

Что такое OpenColorIO?

OpenColorIO (OCIO) — это библиотека, обеспечивающая работу с цветом в индустрии кино. В частности, она использовалась при создании фильмов Человек-паук 2 (2004) и Алиса в стране чудес (2010). OpenColorIO предназначена для преобразования всех цветовых пространств, которые встречаются по ходу продвижения изображения по конвейеру.

Пример. Текстурировщик создал текстуру в цветовом пространстве sRGB, 8-бит на канал. При движении дальше по конвейеру текстура попадает к моделлеру, который, чтобы наложить ее на модель, переводит ее в линейный RGB, 16-бит с плавающей запятой. Рендеринг сцены происходит опять же в линейном RGB, 32-бит с плавающей запятой, и конечный результат переводится обратно в sRGB8, чтобы его можно было показать на стандартном мониторе.

OpenColorIO и Krita: обработка и рисование HDR изображений

Для размышлений на досуге

Почему перед наложением текстуры на модель и, в частности, перед генерацией мипмапов (MIP-пирамиды) текстура должна быть переведена в линейное цветовое пространство? Чем грозит sRGB?

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

Все параметры рабочего процесса в OpenColorIO определяет т.н. кофигурация, которая обычно представляет собой просто каталог с текстовым файлом config.ocio и файлами таблиц преобразования цвета (look-up table, LUT). В файле конфигурации описываются все преобразования между цветовыми пространствами, использующимися в конвейере. Так что чтобы обеспечить единообразную работу с цветом для всех исполнителей, будет достаточно разослать им эту конфигурацию и попросить прописать путь к ней в переменной окружения $OCIO. Все поддерживающие OCIO приложения прочитают эту переменную и автоматически будут использовать правильные настройки.

OpenColorIO и Krita: обработка и рисование HDR изображений

Примеры конфигураций можно найти на официальном сайте.

Почему не ICC?

Многие, вероятно, уже задались вопросом, зачем нужен этот OpenColorIO, когда есть механизм ICC-профилей, стандартизированный Международным Консорциумом по Цвету?

Много-много технических подробностей для интересующихся

Да, действительно, ICC-профили решают похожую задачу. Они тоже описывают, как преобразовать цвет из пространства А в пространство Б. Но у них есть одна особенность: все связи в них осуществляются через абсолютные пространства L*a*b или CIE XYZ. Это было сделано специально. При использовании 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-сервера). Чтобы получить точное воспроизведение цветов, необходимо выполнить несколько несложных шагов:

  1. Откалибровать монитор и построить его профиль. Под Linux это можно сделать с помощью dispcalGUI (проверено с X-Rite i1Display 2) На выходе будет получен ICC-профиль.
  2. Загрузить VCGT-tag (Video Card Gamma Table), хранящийся в ICC профиле, в LUT видеокарты. Под Linux это можно сделать программами xcalib или dispwin. Под Windows достаточно выбрать его в системных настройках. На этом этапе монитор станет откалиброванным, но данные профилирования еще не будут активны.
  3. Выбрать профиль монитора в настройках Криты: 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

OpenColorIO и Krita: обработка и рисование HDR изображений

HDR сцена от Timothée Giet

OpenColorIO и Krita: обработка и рисование HDR изображений

Вместо заключения

В этой статье я попытался рассказать, какие методы работы с изображениями используют в индустрии кино и какой функционал по поддержке этих процессов предлагает Крита.
Этот функционал был добавлен в основную ветку совсем недавно и многие вещи требуют улучшения в плане удобства работы для пользователя. Мы работаем над этим и принимаем любые пожелания по этому поводу.

Автор: dkazakov-dev

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js