Короткий огляд і практичне застосування Гами і Color Mapping у зв'язці 3D max, V-ray і Nuke.
Частина перша. Gamma. Початок
Ця історія почалася з того, що недосконала технологія відображення відеосигналу променевою трубкою страждала сильними провалами в темний бік і справа тут зовсім не в печивах. Компенсувати цей недолік програмно було не можна, а апаратно дуже дорого і тому вирішили вносити коригування в сам відеоматеріал на стадії виробництва контенту. Минули роки, було напрацьовано гори виключно гамаоткоригованих картинок і коли настала ера комп'ютерів ніхто не став пересаджувати індустрію на нові стандарти, а перейняли існуючі. Відтоді комп'ютер і ми бачимо зображення по різному. Якщо для нас все «ок» то для компа картинка виглядає значно світлішою, просто перед тим як показати нам зображення сигнал проходить «природну» зворотну гамма корекцію на боці монітора. Сучасні монітори можуть виводити картинку лінійно, але нас переслідує «спадщина старого часу» у вигляді купи висвітлених фільмів і телепередач.
Все-б нічого, але чомусь комп'ютерна графіка була побудована на математичних принципах і всі маніпуляції з кольором сходяться на банальних арифметичних операціях. І уявіть тепер, що вам треба середній сірий колір збільшити в двоє. У лінійному просторі «середній сірий» дорівнює 0.5 * разом виходить 0 .5х2 = 1.0 тобто вийде чистий білий колір, що цілком логічно, а не в лінійному просторі «середній сірий» дорівнює десь навскидку 0.72, множимо на 2 і виходить... дурниця виходить, хлопці.
Так ось Rendering це купа різних арифметичних збочень і всякі мултіплеєри, оверлеєри і колорберни городять трохи не те, що від них вимагається якщо колірний простір не лінійно. Тому ті у кого очі в змозі відрізнити блакитне від синього вирішили працювати в «лінійці», щоб не створювати собі проблем на всіх етапах обробки зображень.
Правило: Наводимо вхідний матеріал у лінійний простір. Працюємо в лінійному просторі. Гамма-корекція застосовується тільки до фінальної картинки (причому в більшості випадків це відбувається автоматично).
Приклад перекладу гами є в описі до Блендера:
До речі, приводити Normal Bump в лінійний простір не варто, оскільки такі карти вже знаходяться в «лінійці», при підключенні таких текстур треба виключати їх з корекції.
Частина друга. Color mapping
Крім складнощів з гамою ми маємо проблему технологічну, яка впирається в можливості відображення. У нас є 2 основних способи відображення картинок - на папері і на екрані. Обидва способи відрізняються принципово тим, що один відображає світло, а другий випромінює, але той і інший мають дуже обмежений діапазон передачі інтенсивності світла, в порівнянні з тією яку ми можемо побачити, тому зображення треба «стиснути» до потрібного діапазону. Причому недостатньо просто стиснути яскравість, це треба зробити так, щоб в місцях слабкої чутливості стискати багато, а там де у нас багато чутливості стискати треба... ну ви зрозуміли. Робиться це через особливість нашого сприйняття. Зараз я об'єсню трохи детальніше.
Наші почуття нам брешуть.
Ми сприймаємо навколишній світ не лінійно. Щоб посилити відчуття чого або в 2 рази нам недостатньо подвоїти порцію... нам треба її потроїти або вчетверити, тобто якщо накрутити яскравість джерела світла в 2 рази то за відчуттями ми скажемо, що яскравість збільшилася на 30%... ось такі ми «чіткі хлопці». Усі органи почуттів працюють у логарифмічній пропорції. Зворотний натуральний логарифм називають Експонентою... яка і маячить в налаштуваннях Color Mapping. Логарифм - основна функція при перетворенні інтенсивності, незалежно від того чи це зображення, порція солі або радість від кількості грошей в банку.
З цієї причини ми добре розрізняємо півтони в темних ділянках і більш байдужі до перепадів в яскравих. Саме тому при стисненні ми нехтуємо високими значеннями кольору.
Уявіть, що у видимому нами світі різниця в яскравості може заходити далеко за мільйон, а монітор в змозі показати різницю приблизно в 10 000. ColorMapping «вжимає» широкий діапазон яскравості в ту маленьку ділянку який може відобразити монітор або картинка надрукована на аркуші папері, він робить це замість наших очей, а мозок інтерпретує картинку як готове зображення. Зверніть увагу на графік Двоїчного Логарифма, з нього стає ясно - стиснення піддаються в основному світлі ділянки в той час як «тіні» залишаються без зміни, так ми позбавляємося від неприємних «засвітів» якими грішать роботи візуалізаторів-початківців.
Логарифм і гамма це практично одне і теж, але у них є особливі відмінності в побудову: для гами потрібно мати дві крайні точки - нуль і одиницю відповідні чорному і білому кольору, між цими точками будується крива з силою вигину рівній гамі. А ось для експоненти достатньо однієї початкової точки і крива може будуватися до нескінченності. Тому в лінійному просторі з високим динамічним діапазоном (HDR) кольори, де немає обмеження на яскравість застосовується експонента, а вже в готових застосовують гаму. Є звичайно програми де можна застосувати гаму і до HDR зображення, але подібний ілюстрація може призвести до непередбачуваних значень спочатку стоять вище одиниці.
ColorMapping і гамма-корекція дві схожі речі, але займається різними завданнями. Гамма призначена для компенсації «старої спадщини», а ColorMapping стискає «лінійку».
Тобто, в роботі ми враховуємо два окремих перетворення кольору і не треба їх плутати між собою.
Частина Третя. Практична праця
Є два основних шляхи виготовлення картинок. Один шлях призводить до готового файла: з гамою, обрізаною HDR, з мінемальною кількістю біт на канал, з усім тим, що передбачає відсутність серйозних правок. Другий готує «сирий напівфабрикат» який будить «вариться» до готовності в програмі постобробки. Якщо ми готуємо файл для поста, нам потрібно зберегти лінійний простір + високий динамічний діапазон кольорів. Ми розглянемо на практиці обидва методи.
Шлях номер 2. Довше - значить вміючи!
В останній версії 3D Max з налаштувань Гами прибрали Input і Output, тому треба встановити загальне значення гами - 2,2. 3D Мах сам буде приводити вхідні текстури в лінійний простір.
Параметри ColorMapping у 3D Max робимо такими:
Type — Linear multiply. - Ми ж працюємо в лінійці
Dark — 1.
Bright — 1. - ці значення залишимо за замовчуванням якщо знадобиться ми поміняємо їх на пості.
Гамма - 2,2. - Справа в тому що ця гамма не буде застосовуватися до фінального зображення і за фактом залишиться - 1... тому що ми встановимо галочку в:
Don't affect colors - ставимо галку. Ми робимо це для того, щоб залишитися в лінійному просторі, але знаючи те, що Враєвський Sampler вічно не доповідає в темних місцях, ми застосовуємо гаму тільки до нього. Таким чином в темних ділянках у нас деталі не пропадуть і ми залишимося в «лінійці»
Clamp - Вимкнути, оскільки нам знадобиться весь діапазон яскравості.
Зберігайте такі зображення у Float point (32 біт), як - от openEXR. Тепер на виході у нас буде відносно точна модель представлення кольору, майже як в реальності.
Готуємо напівфабрикат у Nuke
Зізнаюся, мені подобається пост своєю творчою гнучкістю. Коли вся основна, груба робота зроблена і залишилося «покрутити» кнопки для смаку.
Опустимо деталі властиві для конкретних проектів і відразу перейдемо до ColorMapping для Nuke.
Отже у нас «лінійна» картинка з випаленими світлими ділянками. Згадуючи мою розповідь про особливості сприйняття ми повторимо схожий фокус. Причому механіка роботи буде схожа з типом Reinhard в ColorMapping V-ray.
Нам знадобиться 2 ноди: Grade и Log2Lin.
Grade буде виконувати роль множника всієї картинки або значення ISO камери якщо вам так зручніше.
Log2Lin буде стискати картинку, але для початку треба його налаштувати:
Operation — lin2log.
Black — 0
White — 255
Gamma — 1
Mix — 0.95
«Стиснута» яскравість ми робимо картинку темнею тому відразу можете поставити значення Gain рівне 5 в налаштуваннях ноди Grade. Mix ноди Log2Lin буде здійснювати тугіше функцію що Burn value в ColorMapping 3D Max тільки в інший бік, тобто якщо Burn value дорівнює 0.3 то Mix встановіть близько 0.7
Шлях номер 1. Без танців.
Якщо ви уникаєте Поста, то можна все перетворення кольору зробити в ColorMapping, але для цього потрібно робити тестові рендери. Виберіть тип переутворення - Rinhard, оскільки він займається усередненням між лінійкою та експонентою через параметр Burn value. Якщо у вас «випалені» кольори то достатньо знизити значення Burn value.
Gamma — 1
Clamp — 1
Don't affect colors - прибрати галку.
Так як тепер Sampler буде розкидати семпли виходячи з видимої картинки то треба знизити поріг шуму в DMC Sampler c 0,01 для «лінійки» приблизно до 0,003.
Деякі хлопці замість того щоб знижувати рівень шуму просто підвищують гаму на 2,2, а в налаштуваннях Гамми програми ставлять одиницю в полі Оутпут. Я вважаю це ідеологічно невірно хоча це теж працює.
_______________________________________________________________________________
* Тут і далі мова йде про значення кольору у Float Point де 0 = чорному кольору, а 1 = білому.