October 24, 2024

Компьютер грефикс, матеметикс! 

Как с помощью математики получать красивые картинки - разбираемся на примере C4D + RS (Часть 1 - Math)

Школа: Где мне вообще эта математика может пригодиться? Было? Было. А теперь, когда нужно сделать простой бленд текстур ты используешь миллионы нод, не понимая, почему все так долго работает или вообще лезешь в другой софт. Спокойно, сейчас мы со всем разберемся.

Сразу несколько оговорок:

  1. Это не ультимативный гайд по всем Math нодам в мире, для этого у каждого софта есть целая страница в хелпе. Мы же с вами поговорим о наиболее полезных из них, а также о том как их использовать в реальном CG бою.
  2. По моему мнению, невозможно рассказывать про Math ноды в отрыве от работы с цветом (речь не про цветовое колесо, а именно про способы блендинга и т.д.). Поэтому, весь материал будет переплетен с Color нодами в угоду большей эффективности. Плюс, у этой статьи будет продолжение, в котором мы отдельно подробнее рассмотрим работу с Color нодами.
Важно: большинство людей считают, что разбираться с математикой в работе это скучно и сложно. Но поверьте - как только вы поймете основы, это сильно развяжет руки в креативных задачах.

Ну, а чтобы не пропустить еще больше полезных материалов - подписывайтесь на меня в телеграм. Там вас ждут: новости из мира CG, обсуждения и разборы мощных кейсов, мысли на тему рекламы и кино.


Начнем с базы:

Как мне кажется, основа для понимания математики в CG, это понимание того, каким образом пиксель превращается в число (предвкушаю духовку в комментариях). Если объяснять на пальцах:

  • ЧБ изображения (любые процедурные шумы или большая часть текстур) - в них черный цвет это 0, а белый цвет это 1. Это принципиально важный момент, его держим в голове
  • Цветные изображения - тут логика та же, но каждый пиксель представляется вектором из 3х значений - R, G, B

Так вот Math и Color ноды позволяют нам каким-то образом менять числовые значения (смешивая их между собой, вычитая и прибавляя одно с другим и т.д.), чтобы затем увидеть результат этого преобразования на рендере. И не имеет значения, вы работаете с текстурами, вертекс атрибутами или с полями - этот принцип работает везде одинаково, в этом и есть его преимущество и красота.


Повторюсь, если вы не доктор математических наук - знать все ноды вам не нужно, достаточно некоторых базовых и понимания того, где и для чего они нужны.

Как по мне, большая часть работы с материалами сводится к блендингу. Так вот, смешивание текстур\шейдеров\материалов между собой (он же блендинг) происходит как раз на основе двух вещей:

  1. Тех указаний что мы даем ПО.
  2. Внутренней математики этого ПО.

И если на второе мы, зачастую, повлиять не можем, то первое зависит только от нас. Давайте разбираться с тем, что мы можем этой софтине такого сказать, чтобы она нас поняла.


1. Add

Add или сложение. Нода принимает два параметра и складывает их между собой. Зачем оно нужно? В большинстве случаев готовая текстура (особенно полученная бесплатно) выглядит стоково, так как ее также скачал не ты один. Тоже самое и с процедурными эффектами, особенно шумами. Даже средней руки CG Artist сможет легко заметить где дизайнер поленился и вместо текстуры просто пихнул процедурный шум.

Чтобы с этим бороться, можно использовать наложение нескольких текстур\шейдеров друг на друга, просто складывая их между собой. Так мы можем контролировать количество деталей и управлять ими (большое\среднее\малое, иф ю ноу).

Пример на огурчиках снизу:

Один Noise, поданный в Bump и Roughness - скука смертная.
Тот же Noise, но к нему добавлены еще 2 с детализацией разного уровня и все это снова подано в Bump и Roughness. Теперь глазу есть куда смотреть, но еще есть с чем поработать, об этом дальше.


2. Multiply

Также известный как умножение. В основном, используется для создания масок. Помните, мы говорили что черный это 0, а белый это 1? А если умножать на ноль - получим ноль, если умножать на 1 - получим исходное значение. Так, получается можно взять одну текстуру и перемножить ее на вторую, тем самым сделав из нее маску.

Пример 1, самый избитый: вы взяли Curvature и перемножили ее на какой-то шум - получили повреждения на краях объекта.

Выглядит все еще стоково, а все потому что надо помнить про логику из первого пункта - надо делать сложнее.

Пример 2: Возьмем наш прошлый плейн и перемножим его на маску шума, там самым получив участки с различным рельефом. Кстати, +- по такому принципу создается всеми любимый процедурный материал "мокрый асфальт".

Все тот же материал из первого пункта, но теперь умноженный на маску, которая регулирует где шум сильнее, а где слабее. Тем самым добавляется еще один уровень детализации.


3. Clamping\ranging

Итак, мы с вами выяснили как важны для нас 0 и 1. Но, должен признаться, все предыдущие пункты я вам не договаривал про последний в этой статье, но не последний по важности, пункт.

Это и есть Clamping - то есть изменение входных значений нуля и единицы. Давайте на простом примере - шуме, поданном в обычную градиентную рампу:

1 - Шум в рампе без изменений, 2 и 3 - Изменение точек черного и белого.

Clamping и Ranging, позволяют вам изменять входные параметры черного и белого в изображении, для дальнейшей работы. Так, я на прошлых этапах поджимал воздействия шумов друг на друга (изменяя количество белого и черного в шумах), чтобы изменить количество деталей шумов или управлять маской.

Зачем еще:

  • Всегда можно использовать одну текстуру для нескольких задач. Например, заремапить Roughness и подать его в Displacement\Bump, чтобы более шороховатые участки также имели неровности.
  • Вы скачали текстуру (очень часто сталкиваюсь с таким у Displacement map), а она недостаточно контрастная, так что деталей не видно. Не проблема - берем и поджимаем значения 0 и 1 с помощью рампы, как на скрине выше, тем самым делая текстуру контрастнее.

Делаеть все это можно целой кучей способов, вот только некоторые из них:

  • Ramp - что Scalar Ramp, что ЧБ из примера выше. Работают +- одинаково, кому как удобнее.
  • Change Range - позволяет напрямую указывать пороговые значения на входе и указывать какие значения подавать на выход (Minimax).
  • Напрямую в настройках некоторых нод - например, у шума это параметры цветов + low\high clip


Вектора:

В самом начале я вам написал что еще существуют вектора. Так вот, для них все работает абсолютно идентично, только к нодам добавляется приписка Vector, то есть нода Add становится Vector Add.

Для чего? Потому что, как я и говорил, цвет, к примеру, это вектор из 3х параметров (R,G,B) и если подать его в ноду Add, то ваш цвет превратится в ЧБ (так как программа автоматически перегонит ваши параметры из Vector в Float параметр). Чтобы этого не произошло - используйте Vector Add (или векторный аналог нужной вам операции). Да и вообще, если что-то не работает - пробуйте изменить тип операции или параметров с которыми работаете. Сейчас все типы параметров разбиты по цветам, однако понимание того, что к чему, все равно приходит с опытом.


Реальный пример:

Кто-то скажет:

"Егор, все эти твои шумы это все хорошо, но как мне использовать все эти нули и единицы в реальной работе?"

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

Уродливый Уитли (похож, не так ли?)

А теперь давайте с ним слегка поработаем:

  1. Берем его карту Albedo и прогоняем через рампу, получаем отдельные зоны снаружи и внутри. Можно повторить несколько раз, для разных эффектов.
  2. Теперь увеличиваем детализацию, используя наши карты для зонирования: где-то добавим металлик, покрасим в разные цвета, добавим потертостей.

На выходе получается вот такой, все еще уродливый, но уже более интересный Уитли:

И всего этого мы с вами добились Math нодами, процедурными шейдерами и всего лишь 1 картой Albedo, не покидая при этом Cinema 4D.


Резюмируя:

Мы все с вами художники и порой лень\страх не дают нам разбираться в технических аспектах. Но, как и было сказано в начале, тут нет ничего сложного, однако это очень сильно развязывает руки для творческих экспериментов. Самое сложное - это не научиться пользоваться этими приемами, а научиться видеть, где их нужно применять.

Конечно, данный подход не может полноценно заменить вам работу с хорошими текстурами и точно не убивает Substance\Photoshop\etc. Однако, понимание того, как оно работает под капотом позволяет не изобретать велосипед, а сосредоточиться на креативных задачах.

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

И конечно, чтобы не пропустить еще больше полезных материалов - подписывайтесь на меня в телеграм. Там вас ждут: новости из мира CG, обсуждения и разборы мощных кейсов, мысли на тему рекламы и кино. Всем классных рендеров и ловите тефтелю! ☄️