Как сделать карту высот в фотошопе
Здравствуйте, меня зовут Булатов Евгений, иногда подписываюсь как Vendigo. Ниже я расскажу об одном интересном методе создания normal map из фотографий.
Часто для создания текстур используются фотографии. Однако в наш технологичный век мало создать diffuse текстуру, нужны еще текстуры бампа, спекуляра, и бог еще знает чего. К сожалению, фотоаппарат может сфотографировать только цвет. Я слышал, в этом направлении ведутся работы, но это еще только работы. Так что все труды ложатся на руки художников. А все, что есть в нашем арсенале это только Photoshop, ну может быть еще и Wacom. Не спорю, это конечно круто, но все равно не достаточно. К нашему счастью умные парни из Nvidia сделали плагин для Photoshop`а - NVIDIA Normal Map Filter, который позволяет создавать из карты высот карту нормалей. Этим плагином мы и воспользуемся.
После установки он появится в меню Filter – NVIDIA tools – NormalMapFilter.
Основные настройки сосредоточены в поле Height Generation.
Поле Scale - задает масштаб по высоте для карты нормалей. Выше него находится ряд переключателей детализированности карты. Подбирая эти два параметра, мы получим или детализированную или глубокую карту, но все вместе.
На рисунке показаны разные варианты сгенерированных карт нормалей:
Но есть интересный метод, позволяющий создавать объемную и вместе с тем детальную карту нормалей.
Алгоритм по шагам:
- Переведите изображение в режим 16 Bits/Chanel (в меню Image – Mode). Это улучшит качество последующих преобразований.
- Скопируйте слой с изображением (Ctrl+J).
- Нам нужна черно/белая карта высот, поэтому обесцветьте его (Ctrl+Shift+U).
- Примените к этому слою фильтр Normal Map с настройками, обеспечивающими максимальную детализацию, и небольшую высоту. Например, 4 sample, Scale – 3. Если на этом шаге вы получаете странный результат, то вернитесь к настройкам фильтра и установите все переключатели, в положение как на скриншоте выше.
- Скопируйте этот слой (Ctrl+J), назначьте ему режим Overlay. Таким образом, вы сделаете вашу карту нормалей в два раза более выпуклой.
Рендер в 3DSMax
Отступление первое:
Плагин NVIDIA Normal Map Filter, преобразует карту высот в карту нормалей. Поэтому для него подходят изображения, где темные участки соответствуют углублениям, а светлые выпуклостям. Часто приходится вручную дорабатывать карту высот из исходной текстуры, рисуя поверх фотографии карту высот.
Отступление второе:
Операция нормирования (применение фильтра Normal Map в режиме Normalize only) нужна потому, что после наложения нормалей в режиме Ovelay, информация в синем канале теряется. Операция Normalize восстанавливает ее.
Есть мнение, что при наложении нормалей нужно Красный и Зеленый каналы смешивать через Overlay, а Синий накладывать в режиме Multiply. Те, кто хорошо знают Photoshop, могут написать экшн для подобной операции и попробовать метод с таким, более «правильным» смешиванием.
Отступление третье:
Сходимость текстуры. Если ваша текстура тайлилась, то после этих операций нормали сходится, не будут (появится острая кромка по краям). В этом случае можно делать так:
Перед созданием normal map, увеличьте размер холста в 3 раза. Canvas Size 300% (Ctrl+Alt+C). Затем скопируйте вашу сходящуюся текстуру на всю площадь.
После чего объедините эти слои и создайте normal map, как было описано выше. Затем, вызовите еще раз команду Canvas и впишите исходный размер в пикселях (например, 512 х 512) . У вас получится исходная текстура нормали, которой будут идеально сходиться.
Из этой статьи вы узнаете о картах высот (height maps), также называемых картами параллакса (parallax maps).
Что такое карта высот?
Как обычно, когда я говорю «карта», то имеют в виду текстуру, содержащую информацию о внешнем виде 3D-объекта. Карта высот/параллакса — это карта, которую можно использовать для того, чтобы создать иллюзию того, что одни части объекта выступают сильнее, чем другие, то есть имеют бОльшую высоту.
Без карты высот.
С картой высот.
По описанию это может показаться очень похожим на карту нормалей (normal map), благодаря которой 3D-объект кажется более рельефным, но действует она немного иначе. Карта нормалей использует освещение, чтобы объект казался более рельефным, чем на самом деле. Карта высот использует параллакс, чтобы сделать объект выше, чем на самом деле.
Параллакс
Замечали ли вы в детстве, что когда идёшь вечером, луна идёт за тобой? Объекты, мимо которых мы проходим — или движемся параллельно им, приближаются и удаляются, но луна всегда занимает в небе одно и то же место. Если вы, как и я, выросли рядом с горами, то могли также замечать, что они тоже не очень быстро двигаются, однако если уехать достаточно далеко, они всё-таки останутся позади. Чем дальше от нас предметы, тем медленнее они «движутся» при изменении угла взгляда на них (например, когда проезжаешь их на машине) и чем ближе объекты, тем быстрее они смещаются при смене вашей позиции и угла взгляда.
В таких двухмерных играх-сайдскроллерах, как Mario или Rayman, создатели использовали этот эффект. Они создали несколько слоёв фона, прокручивающихся с разной скоростью в зависимости от того, насколько близкими они должны казаться. Это просто иллюзия — разумеется, все спрайты плоские, но она придаёт сцене ощущение глубины!
Однако в 3D-графике мы тоже можем использовать это явление. Но вместо прокрутки здесь можно комкать или растягивать координаты текстур в зависимости от направления обзора, чтобы обмануть глаз и увидеть глубину! Именно этим данный эффект отличается от карты нормалей. Карта нормалей оставляет неизменными координаты текстур, но изменяет сторону, в которую по нашим ощущениям направлен объект. Карта высот сохраняет направление, но меняет координаты текстур, которые мы используем для всех остальных карт.
Если посмотреть на них по отдельности, то различия очевидны. Вы можете воссоздать изображения из статьи в собственном проекте, или просто читать её.
Материал плоскости имеет только этот шахматный паттерн в качестве основной текстуры albedo и больше никаких других карт.
Здесь использован шахматный паттерн как основная текстура albedo и карта нормалей в виде акустического поролона (acoustic foam). Заметьте, что шахматный паттерн по-прежнему идеально ровный.
Здесь шахматный паттерн используется как основная текстура albedo, а acoustic foam — как карта высот.
Если приглядеться, то можно увидеть, что эффект неравномерный! Так получилось, потому что направление обзора этих двух частей неодинаково.
Эффект довольно интересен, но лучше всего он работает, если вы смотрите на плоскость почти перпендикулярно, и разваливается при взгляде на плоскость сбоку.
Итак, всё это очень здорово, но иллюзия может добиться только этого. Похоже, что лучше всего её использовать в небольших дозах на тех объектах, на которые игрок не сможет смотреть под такими углами.
А вот плоскость с шахматным паттерном в качестве текстуры albedo, картой нормалей acoustic foam и картой высот acoustic foam. Они отлично сочетаются! Ну ладно, хватит болтовни, давайте уже напишем шейдер, выполняющий эту задачу!
Подготовка
Откройте сцену в Unity. Добавьте плоскость, нажав правой клавишей мыши внутри иерархии и выбрав 3D Object > Plane.
Назовите новый файл шейдера BasicParallax, затем дважды щёлкните по нему, чтобы открыть его в Visual Studio. Измените первую строку на Shader «Xibanya/Standard/BasicParallax», затем сохраните его и вернитесь в Unity.
Назначьте шейдер BasicParallax материалу Crystal Ore. Теперь можно перетащить в слот текстуры карту albedo.
Создаём шейдер
Мы уже говорили о том, как использовать карту нормалей, metallic map и так далее, поэтому я буду предполагать, что вы уже знаете, как это делается. (Если нет, то прочитайте информацию по ссылкам и возвращайтесь!).
Перейдите к созданному мной базовому шейдеру, нажмите на кнопку Raw, скопируйте и вставьте шейдер в BasicParallax (но перед сохранением обязательно измените название сверху на Xibanya/Standard/BasicParallax!). Теперь можно перетащить карту нормалей и карту AO.
Я создала этот минималистичный шейдер для записи всех свойств, используемых стандартной моделью освещения (Standard lighting model), и больше в нём ничего нет, поэтому требуется дополнительная настройка, чтобы шейдер мог использовать roughness map. Добавьте эту строку в свойства (например, над gloss map)
Добавьте это под surface pragma
Затем измените часть, после которой распаковывается glossmap, на это:
(Если вы незнакомы с roughness map или ключевыми словами, то о них можно прочитать здесь!) Завершив с этим, сохранитесь и возвращайтесь в Unity. Теперь перетащите roughness map и переключите флаг Roughness на true.
Отлично! Наконец мы подготовили основу, настало время приступать к параллаксу!
Создание шейдера параллакса
Наверху, в разделе свойств добавьте следующие пять строк:
Мы сделаем параллакс функцией, которая активируется/отключается ключевым словом _PARALLAXMAP. Для правильно применения карты параллакса нам нужно использовать касательное направление обзора. Если мы пишем поверхностный шейдер, то если ключевое слово задано (то есть мы его включили), это будет направление обзора, получаемое от структуры Input. Если ключевое слово _PARALLAXMAP не задано, мы всё равно будем получать касательное направление обзора, если выполняем запись в o.Normal. Однако возможно, что мы не всегда будем это делать, поэтому об этом легко забыть и запутаться, поэтому лучше привыкнуть использовать его каждый раз, когда нам нужно распаковать карту параллакса! В pragma ключевого слова Roughness добавим следующую строку:
и добавим в структуру Input float3 viewDir.
Наконец, объявим в подшейдере текстуру карты параллакса и свойства силы параллакса.
Сохраним код и вернёмся в Unity, чтобы убедиться, что не сделали никаких опечаток или ошибок. Если всё правильно, то теперь мы можем перетащить текстуру CrystalOre_1k_height в слот карты параллакса материала. Не забудьте там же включить параллакс.
Разумеется, это пока ни к чему не приведёт, ведь мы не внесли никаких изменений в функцию поверхности! Мы используем карту параллакса для определения того, как сжимать или растягивать координаты текстуры, поэтому нам нужно обрабатывать всё связанное с параллаксом перед всем остальным. Добавим следующее в самое начало функции поверхности:
Мы распакуем текстуру и возьмём зелёный канал (большинство карт высот чёрно-белые, из-за чего все каналы одинаковы, поэтому нам достаточно использовать один), а затем передадим его, силу параллакса и касательное направление обзора (удобно вычисленное за нас магией поверхностного шейдера Unity) во встроенную функцию под названием ParallaxOffset. ParallaxOffset — это величина, определяющая сжатие или растягивание UV-координат в зависимости от направления обзора. Её можно найти в библиотеке UnityCG.cginc, включаемой в каждый поверхностный шейдер. ParallaxOffset возвращает значение float2, которое мы затем можем прибавить к координатам текстуры IN.uv_MainTex (которые также являются float2!), чтобы каждая распаковываемая после этого текстура распаковывалась со смещением. Если вам любопытно, то это выглядит так, но вам необязательно знать, как это работает, чтобы добавить параллакс к своим поверхностным шейдерам!
(не добавляйте это в свой шейдер, этот код уже встроен!) И наша работа здесь на этом закончена! Сохранитесь и вернитесь в Unity. Поиграйтесь с ползунком Parallax Strength, чтобы увидеть эффект в действии.
Сила равна 0
Сила равна 0.1
В свойствах я при помощи ползунка с интервалом ограничил силу параллакса в пределах от 0 до 0.1, потому что при значениях выше 0.1 всё начинает выглядеть довольно безумно даже при самых идеальных углах обзора, но вы можете изменить свойство с интервала на float, чтобы поэкспериментировать с различной силой параллакса.
Созданный в этом туториале шейдер приложен к этому посту как BasicParallax.shader. Если у вас есть вопросы или вы хотите поделиться тем, что у вас получилось, то напишите в комментариях к оригиналу статьи, в Twitter или в Discord.
новый проект новый террейн вот так он выглядит
Итак, ландшафт готов, самое время его сделать объемным
Можно использовать инструменты в инспекторе:
Но такой способ неудобен и подходит либо для создания маленьких карт, либо для редактирования уже готовых
Берем карту высот
Для начала надо взять образец карты в самом движке
Переходим в Settings(шестеренка справа)
(P.S): чуть выше в графе terrain width и terrain height поставьте значения побольше(у меня это раз в 10)
Heightmap resolution - разрешение карты. Чем выше - тем карта точнее. Но острее. У меня стабильно 1025
Import Raw / Export Raw - кнопки для импорта/экспорта карты соответственно
Control texture resolution - "смешивание" текстур рельефа.
Я сам не знаю что это, поэтому я оставляю по умолчанию. Если что, потом методом тыка подкрутим
Ну и Base texture resolution - разрешение текстур. Чем все эти цифры выше - тем качественнее террейн. Ежу понятно.
В итоге мои значения такие:
Нажимаем Export Raw и.
Я оставил как есть. Затем просто нажимаем кнопку export и сохраняем карту. Идем дальше
Редактируем карту
Я сохранил карту(она должна быть в формате .raw). Затем открыл ее с помощью фотошопа.(просто нажал о ней ПКМ -> Открыть с помощью -> Photoshop)
Еще я скачал самую простую карту высот из интернета. Вот она:
Тоже открываю эту картинку в фотошопе -> ctrl + A -> ctrl + C
Переходим в файл с картой высот и ctrl + V
В итоге получается так:
(карту еще придется немного уменьшить)
Черной кистью удаляю все ненужное:
Затем ctrl + shift + S и выбираем формат .RAW
Возвращаемся в Юнити
Находим кнопку Import Raw
Вот она
И выбираем нашу RAW карту
Ничего не меняем и нажимаем Import
И тут такое.
Вполне возможно, что у вас будут либо штыки либо ничего. Не паникуем! Это мой горький опыт. Надо просто поменять цифры в настройках террейна
Было так
1) Я вернул значения с 10000 на 1000(в графах terrain width и height)
2) Terrain Height на 5000 вместо 600 по дефолту
3) Heightmap Resolution на 513 (у меня все было резко, острые края и т.д)
Вдали вроде бы все размыто, но. Вблизи
Вывод
Как бы не была сложна технология, выход всегда есть. Более подробно на сделал на ютубе.
Сегодня я немного освежил технологию импорта карты высот в юнити и считаю это своим достижением.
Это мой личный способ. Я понимаю, что все карты разные, но технология одна и та же. Надо просто покопаться в цифрах и все получится😎
По роду деятельности столкнулся с вопросом: как сделать карту высот.
Чтоб было понятно: 1 - модель, -> 2 - карта высот, -> 3 - барельеф (то что получаем в материале).
Решение есть в виде Stereographic Suite и плагина для Blendera/Maxa, но: 1 - хочется получить результат в Realsoft "без посредников" , 2 - приходится увеличивать количество полигонов на порядки (т.е. дальнейшее редактирование становится невозможным).
Я уверен, что с помощью Post Image Effects это в один клик делается, но слабое знание VSL ставит меня тупик. Кроме рентгеновского изображения ничего не получается .
Кто знает помогите, плз. Очень надо.
Вложения
__yra
Активный участник
Seminarist
Активный участник
Плохо объяснил.
Про Colormap написано в мануале, там все понятно.
Есть моделька (рисунок 1). Нужно получить карту высот (картинку 2) при рендере этой модельки в виде растрового изображения в черно белых тонах для того, чтобы этот растр вставить в другую программу, которая на станке мне вырежет по этому ратстру барельеф, например, из латуни (рисунок 3).
Поэтому я и говорил про постобработку. Не могу разобраться, какие каналы на входе и выходе должны быть. Хотя бы примерчик маленький, там разберусь.
Спасибо.
__yra
Активный участник
Вложения
Seminarist
Активный участник
На первый взгляд, да, вариант с АО выглядит привлекательнее - границы более четкие, видно больше элементов, но. программа считает иначе Я взял твои картинки, и вот что получилось. 1 - hm, 2 - ao. Это если посмотреть рыбине снизу в брюхо Разница очевидна. Но на поверхности рельефа растр с АО несомненно выигрывает. Так, что буду комбинировать.
Блин. файл не могу открыть - программа вылетает. У меня стоит v.6 х 64, можно ли как-нибудь адаптировать файлик.
Вложения
__yra
Активный участник
Seminarist
Активный участник
Еще раз ОГОМНОЕ СПАСИБО. То, что надо. От ЧПУ-шников низкий поклон.
И если не затруднит, за что каждый node отвечает, а то я как мартышка и очко: тыркаю параметры - картинка меняется. Хотелось бы, чтобы этот процесс осознанным был, т.к., если рендерить с ракурса и с перспективой нужный эффект улетучивается, и необходимо что-то где-то подкрутить и в какую сторону непонятно.
Спасибо.
__yra
Активный участник
Создаётся глобальная переменная - FLOAT Var115 типа (Float)
В шейдере поверхности:
1п. - в переменную копируется значение дистанции от поверхности до камеры Var115=Copy(Distance);
2п. - учитывая, что средняя величина дистанции значительно больше чем величина дельты между максимальной и минимальной дистанцией (яркий пример дельта дистанции на чешуе) следующие 2 действия просто растягивают дельту, как именно это исполнить это уже на вкус конкретного пользователя;
3п. - далее Var115=Curve(Var115) кривая инвертирует значение и немного его корректирует по диапазону;
4п. - после этого в шейдере финальной обработки копирую значение из "обработанной" переменной в канал яркости.
Для точного отображения результата значение Flashlight камеры устанавливаю в 0, то есть убираю подсветку сцены по умолчанию.
Естественно. что в зависимости от конкретной модели и её размера нужно подобрать минимальную дистанцию от камеры до модели, чтобы меньше замарачиваться с вычислениями описанными в пункте 2п.
Вроде всё описал
Seminarist
Активный участник
Парадокс: когда читаешь разжёванное и смотришь на картинку - вроде всё понятно, а как начинаешь сам лепить, то оказывается руки-то произрастают совсем из непривычного (или неприличного) места ))
Ещё раз спасибо.
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Это обещанное продолжение статьи Моделирование по изображениям с картами высот, в которой я рассказывал, что это за изображения и как их искать.
Сегодня расскажу, что делать, если не удалось найти качественный исходник, но получить модель очень хочется.
Возьмем некачественное изображение в формате jpeg и выдавим 'как есть' в Cura.
Видим многочисленные артефакты.
Cетка - след компрессии jpeg.
Попробуем улучшить ситуацию, используя графический редактор GIMP.
Убираем артефакты jpeg-компрессии
Открываем исходное изображение Файл — Открыть
Создаём новое изображение (Файл — Создать) размером 8×8 px с прозрачным фоном
Далее: Правка — Копировать и это окно можно закрывать без сохранения.
Выбираем инструмент 'Заливка'. В параметрах выставляем 'Залить текстурой' и выбираем 'Буфер обмена'.
Создаём новый прозрачный слой через Слой — Создать слой. Заливаем его текстурой. Должно получиться так:
Артефакты jpeg-компрессии представляют собой кластеры 8х8 пикселей, и сейчас мы наложили на границы кластеров сетку толщиной в 1 пиксель.
На панели слоёв щёлкаем правой кнопкой мыши по слою с 'сеткой' из текстуры и выбираем 'Альфа-канал в выделение'. Теперь удаляем слой с текстурой, он нам больше не нужен.
Продублируем оставшийся слой (Слой — Создать копию слоя). Добавим к копии альфа-канал (Слой — Прозрачность — Добавить альфа-канал)
Далее Выделение — Инвертировать, Правка — Очистить, и снова инвертируем выделение и размываем его по Гауссу (Фильтры — Размывание — Гауссово размывание) на 1-15px, в зависимости от ситуации.
Сохраняем изображение в BMP.
Убираем ступеньки
Ступеньки получаются из вот таких 'пикселей':
Очистка фона
Тут есть много способов. Я сделаю так: инструмент Выделение смежных областей, выбираю черный фон
Инструментом Заливка заливаю фон свежим чистым цветом. Сохраняем в BMP.
Возвращаемся в Куру:
Спасибо за внимание.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Читайте также: