Математика в 3Д ► 06. Процедурные Текстуры
Geometry Nodes (Геометрические Ноды или ГН или геоноды) по многочисленным просьбам включены в рассмотрение примеров. Хочу только обратить внимание на то, что в разной форме уже писал во всех ответах на тему Геонодов:
Если вы интуитивно чувствуете, что в Геонодах сокрыт некий могучий потенциал, некое откровение, временно недоступное вам, если вы рассчитываете, что как только вам покажут, как добавить и соединить между собой тайные профессиональные ноды, а вы это повторите, то сразу же научитесь генерировать всякую крутотень - то вынужден вас разочаровать: Геоноды - это не о крутых возможностях и удобных инструментах. Геоноды - это полностью о математике. Самые крутые ноды в них - всё те же Math и Vector Math, и математика в них ничем не отличается от математики в шейдерах или от математики, которую проходят в школах и институтах в цивилизованной части вселенной. Это не магия Хогвартса, не Драконий Язык и тем более не плетения Единой Силы (нет, не джедайской, хотя и она здесь так же ни при чём). Это всё та же математика, которой все мы недостаточно хорошо учились когда-то, всякие там числа, нули, единицы, плюсы, минусы, синусы-косинусы, вот это вот всё, о чём я тут пытаюсь рассказывать. Только в геонодах её больше, и она сложнее.
Но к этому мы ещё придём. Куда ж мы денемся. А сегодня речь пойдёт о простом, красивом и приятном. О процедурных текстурах или шумах, как их ещё называют. Буду очень благодарен всем, кто решит стать платными подписчиками или разово задонатить на означенные цели. Это сильно мотивирует на продолжение.
Для начала поясню, как у меня настроен проект и что я, собственно, буду показывать. По очереди слева направо:
↑ Шар созданный из дефолтного куба путём добавления модификатора Subdivision Surface с уровнем разделения 4 и модификатора Cast с фактором 1, для получения идеальной сферы с квадратной топологией. Поверх всех модификаторов на объект добавлены геометрические ноды. Материал на этом объекте отсутствует, потому что мы будем смотреть на нём только изменения геометрии с помощью Геометрических Нодов.
↑ Плэйн, состоящий из одного полигона, без модификаторов. В его материале мы будем подключать всё напрямую к Material Output, без каких-либо шейдеров, чтобы смотреть, как выглядят срезы текстур в чистом виде.
↑ Плэйн, продублированный 5 раз по оси Z модификатором Array (см. настройки). В его материале шейдеры Emission и Transparent суммируются с помощью Add Shader. Таким образом, непрозрачными будут только те участки поверхностей, на которых параметр Strength нода Emission будет равен 1 и выше, а остальные при приближении к 0 будут постепенно становиться прозрачными. Соответственно, мы будем подключать результаты к параметру Strength нода Emission. Это получается аналог Volumetric материалов (далее - волюметрики), о которых речь пойдёт дальше, но, в отличие от волюметриков, с небольшим количеством слоёв он рендерится существенно быстрее и отображает текстуру намного чётче. То есть на нём мы будем смотреть сложенные вместе срезы текстуры, и это позволит нам получить представление о том, как она выглядит в трёхмерном пространстве.
↑ Куб с волюметрик-материалом. Обратите внимание, что нод Emission подключен ко входу Volume нода Material Output. Таким образом, мы будем использовать в материале не поверхность куба, не его полигоны, а то, что находится внутри его объёма. Подключать результаты мы будем всё так же к параметру Strength нода Emission.
↑ Сверим настройки рендера. Я буду использовать Cycles, без денойза вьюпорта, Во вкладке Volume уменьшу параметр Step Rate для вьюпорта и рендера до 0.1, а Step Rate до 12 (хотя вот сейчас понимаю, что его стоило оставить хотя бы на 50). Что это за параметры я объяснял в этом видео. Во вкладке Light Paths все баунсы выставим в 0, кроме Transparent, потому что в объекте с Арреем лучи рендера должны 5 раз проходить через прозрачные поверхности. Всю каустику тоже отключим, она не понадобится. Подробнее о настройках рендера в Cycles можно посмотреть в этом плэйлисте. Некоторые элементы, которые я там показываю (например, система тайлинга), на данный момент уже устарели, но общие принципы остались теми же.
↑ Вот что получается в итоге. Сфера - вид спереди, остальные объекты - вид сверху. В нижней части - для сферы редактор Geometry Nodes, для остальных объектов - Shader Editor с их материалами
↑ Добавим для начала на все объекты одну и ту же систему координат - Object. В Geometry Nodes её заменяет нод Position, который генерирует те же значения, что в Shader Editor нод Texture Coordinate в режиме Object. В данный момент, насколько мне известно, других текстурных координат в геоноды не завезли. Чтобы найти нужный нод, нажимаем Shifr+A > Search (сверху) и начинаем вбивать в поисковой строке название нужного нода. Либо, если нод нужен, как продолжение существующей связки нодов, нажимаем на кружок нужного выход предыдущего нода, удерживая кнопку мыши, начинаем вытягивать линк, отпускаем кнопку мыши и снова появляется поисковая строка. Для начала во всех нодах мы будем использовать уже знакомы нам нод Sepаrate XYZ, который разделяет систему координат на отдельные оси, и подключая его к выходу материала, мы можем смотреть графические репрезентации их числовых значений, сгенерированных системой координат.
↑ Поскольку моя идея в том, чтобы показывать, как выглядят одни и те же настройки, в одном из материалов я с помощью Ctrl+G помещу нод Separate XYZ внутрь группы (войти/выйти в группы - Tab) и в настройках группы внутри неё в N-панели удалю все лишние выходы, оставлю только выход X.
↑ Это позволит мне изменять настройки только один раз - внутри группы, а они при этом будут меняться одновременно во всех материалах, которые её используют. Сначала смотрим на три окошка справа - это материала объектов в Shader Editor. С помощью Shift+A > Group добавляю эту группу в остальные материалы вместо нодов Separate XYZ. Подключая ко входу в группу текстурные координаты, а выход из группы в соответствующие слоты нужных нодов.
В геонодах, несмотря на то, что ноды используются те же, используется отдельная внутренняя иерархическая структура, поэтому группы из Shader Editor в них использовать нельзя. Поэтому в них я создам из Separate XYZ собственную группу по тому же принципу. Я хочу использовать то, что будет их этой группы приходить, по принципу модификатора Displace - чтобы результат группы сдвигал вертексы относительно их нормалей. Я добавляю к исходной геометрии нод Subdivision Surface, который действует как одноимённый модификатор, чтобы подразделить и сгладить геометрию, чтобы у нас были более точные отображения текстур. После этого я добавлю нод Set Position, в котором с помощью параметра Offset можно сдвигать вертексы. Чтобы сдвигать вертексы не в глобальном мировом пространстве, а по направлениям нормалей объекта, получаемый в группе результат до использования в качестве Offset мне нужно предварительно умножить на векторы нормалей. Для этого я добавляю нод Normal, который возвращает нормали геометрии объекта и с помощью Vector Math в режиме Multiply (умножение) умножаю его на результат, выходящий из группы.
↑ Теперь я буду использовать только содержимое групп, зайдя внутрь групп с помощью Tab, а геоноды и все 3 материала будут обновляться автоматически. Проанализируйте, как повлиял на сдвиг вертексов по направлению их нормалей добавление градиента из Separate XYZ. Напомню, что он начинается в минусовом диапазоне.
↑ Первый пример текстуры - нод Noise Texture. Один из наиболее распространённых шумов, внешне напоминающий облачка. Напомню, что чёрный цвет в блендер эквивалентен 0, а белый - 1, исходя их этого на примере геонодов можно видеть, на какие значения сдвигаются вертексы по направлению своих нормалей.
⚠ Обратите внимание! ⚠
В отличие от нодов Image Texture, использующих 2Д текстуры - картинки, у которых есть только ширина и высота, все процедурно генерируемые шумы трёхмерные! То есть, помимо высоты и ширины, у них есть ещё и глубина. Они получают на вход систему координат, которая, напомню, для каждой точки пространства генерирует уникальный набор из трёх чисел - значений по осям XYZ. Получив эти числа, для каждой точки пространства они высчитывают по определённым сложным математическим алгоритмам новое число и на выходе возвращают результат математической операции.
🛈 Справедливости ради, они, конечно, высчитывают это значение не для всех-всех-всех точек пространства от минус бесконечности до плюс бесконечности. Они их высчитывают для тех точек, которые попали в объектив камеры - то есть для каждого пикселя, существенно сокращая таким образом объём вычислений. Но принцип остаётся тот же - камера "смотрит", чему равно на месте пикселей значение текстурных координат, а нод текстуры принимает значения на месте этих пикселей на вход, высчитывает новые значения после чего уже они используются на месте пикселей.
↑ Подробно настройки каждой текстуры мы будем рассматривать в последующих уроках, а сейчас просто посмотрим примеры результатов, которых можно достичь с их использованием. С небольшой детализацией можно менять и искажать общие формы - в случае с геометрией. Или создавать плотные слои тумана - в случае с шейдерами
↑ При добавлении детализации можно получить более жёсткие формы, напоминающие камни
↑ Поскольку фактически ноды текстур дают на выходе те же самые числовые значения, их более чем уместно обрабатывать с помощью математики. И там, и там используются ноды Math в режимах Power (возведение чисел в степень) и Multiply (умножение)
↑ Математика - не только сложение и вычитание но и булевая логика. Нод Math в режиме Greater Than устанавливает порог срабатывания. Все входящие значения ниже его становятся равными 0 (чёрными), все значения выше него становятся равными 1 (белыми).
↑ Другая, также очень часто используемая текстура - это Voronoi. Все материалы и поверхности, в которых в той или иной форме присутствуют ячейки: клетки, поры, кратеры и т.п. - это Voronoi.
↑ Это могут быть не только органические, но и упорядоченные формы
↑ В Voronoi Texture несколько типов и несколько подтипов режимов в каждом типе. Подробно мы будем о них говорить в следующих уроках.
↑ Кто сказал, что ячейки в Voronoi обязаны быть круглыми? Точно не Chebychev!
↑ И определённо не Minkowski - кстати, обратите внимание, как вжимаются в центр части меша с геонодами. Верный признак того, что в этом режиме присутствуют значения из минусового диапазона.
↑ В режиме Distance to Edge нода Voronoi можно создавать наиболее тонкие линии из всех процедурных текстур. Трещины, молнии - всё это Voronoi в сочетании с другими нодами.
↑ Ещё одна текстура - Musgrave Texture. Это процедурный высокодетализированый фрактальный шум. Все помнят, что такое фракталы (не из Half Life, а из математики)? А между прочим стоит, хотя бы общее определение, хотя бы одно ключевое слово, которое определяет их суть!
⚠ Обратите внимание! ⚠
Сверхполезный лайфхак! Если вы что-то не помните или не знаете, потратьте двадцать секунд, забейте вопрос в гугл или яндекс и пробегитесь глазами, чтобы уловить самое главное. При необходимости можно потратить даже минуту или несколько. Это в каждом случае может сэкономить вам до нескольких часов или дней работы. Помните всегда-всегда, никогда не забывайте: поисковые системы - это ежедневный, ежечасный рабочий инструмент. Не знать что-то - не глупо. Глупо - делать вид, что знаешь. Глупее только не гуглить, потому что лень.
↑ Надеюсь, все последовали совету, и нашли хотя бы слово "самоподобие". Добавляя детализации, мы добавляем уровни самоподобия, и таким образом можем получать очень "острые" результаты
↑ По замыслу авторов основное направление использования Musgrave Texture - генерация ландшафтов. Да, и использование математики всё ещё никто не отменял.
↑ А я для себя выяснил, что она также отлично подходит для создания всяческих энергетических структур (см. материалы).
↑ На англоязычном канале у меня есть урок, в котором я использовал Musgrave Texture с похожими настройками для создания космических туманностей. Причём это простой, короткий урок, а не как у меня обычно.
🛈 Кого смущает английский язык (или мой акцент), ещё один лайфхак: просто отключаете звук, внимательно смотрите на экран и повторяете в Блендер. В девяноста процентах случаев всё окажется понятным и без слов. Или не отключаете звук, просто игнорируйте - тогда со временем вы с удивлением обнаружите, что понимаете иностранную речь, даже если никогда этому не учились. А если практиковать это постоянно, может настать момент, когда вы поймаете себя на том, что вам вообще нужно приложить усилия, чтобы понять, на каком из языков вы смотрите видео. Мозг человека - очень странная адаптирующаяся штуковина.
И напоследок обзорно рассмотрим ещё несколько менее универсальных, но от этого не менее интересных текстур.
↑ Wave Texture - волны с возможностью искажения, изменения частоты и сдвига фазы.
↑ Magic Texture - за пафосным названием скрывается достаточно неказистый и слабо управляемый паттерн. Долгое время в документации Magic Texture значилась как редко используемая, позже исправили на текстуру для создания психоделичных цветов. Не знаю, как по-вашему, достаточно психоделично?
↑ Brick Texture - кирпичи. Напомню, они, как и остальные процедурные текстуры, трёхмерные. Слишком ровные, чтобы быть реалистичными, но иногда пригождаются.
↑ Настоящее веселье начинается, когда текстуры начинают взаимодействовать между собой. Они же трёхмерные - в таком случае, кто нам, например, запретит использовать одну текстуру в качестве системы координат для другой текстуры? Вороной? Чебышев? Минковский? Не думаю.
Буду очень - я имею в виду ОЧЕНЬ - благодарен вашей информационной поддержке и вообще любой активности - лайкам, комментариям, репостам. Это помогает донести эти уроки до большего количества людей. Без рекламы сейчас такие вещи очень медленно развиваются. Если делать рекламу, то уроки придётся делать платными, а мне бы не хотелось сейчас сворачивать на этот путь. Поэтому всё зависит только от вас. Спасибо!