1uomo.ru

Мода и Стиль
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Смешивание текстур ландшафта

Смешивание текстур ландшафта

В данной статье я расскажу об алгоритме смешивания текстур, который позволяет привести внешний вид ландшафта ближе к естественному. Этот алгоритм легко может быть использован как в шейдерах 3D игр, так и в 2D играх.

Статья рассчитана на начинающих разработчиков игр.

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

Теперь перейдем к самому интересному — алгоритмам смешивания текстур. Для простоты и наглядности наш ландшафт будет состоять из песка переходящего в крупные булыжники.

Самый простой способ смешивания — перемножить цвет текстуры и прозрачность, а результаты просуммировать.

Именно такая техника используется в Unity 3D в стандартном редакторе ландшафта. В глаза сразу бросается плавный, но неестественный переход. Камни выглядят равномерно испачканными песком, а ведь так не бывает в реальности. Песок не прилипает к камням, наоборот, он осыпается и заполняет щели между ними, оставляя верхушки камней более чистыми.

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

Первым делом рассмотрим упрощенную модель карты глубин песка и камней.

Синей линией условно обозначена карта высот песка, а красной — булыжников. Можно заметить, что верхушки булыжников выступают над уровнем песка. Учитывая этот факт, попробуем выводить пиксели той текстуры, которая находится выше.

Отлично! Верхушки камней остаются чистыми, тогда как песок кажется осыпавшимся в щели между ними. Но мы еще не учли степени прозрачности слоев. Для этого мы просто сложим карту высот с картой прозрачности.

За счет суммирования менее прозрачная текстура будет находиться выше, чем обычно.

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

В коде выше мы сначала выделяем часть видимого на определенной глубине рельефа.

А потом нормализуем его для того, чтобы получить новые степени прозрачности.

В итоге мы получили механизм смешивания текстур, который дает результат близкий к естественному виду ландшафта.

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

Шейдер разрабатывался для инди-игры Steam Squad в жанре изометрической 2D стратегии. В качестве фреймворка для разработки мы используем Unity 3D. А так как среда разработки Unity чрезвычайно гибка, мы сделали свое расширение — редактор уровней. По большому счету, редактор является упрощенной копией стандартного редактора ландшафтов с элементами взятыми из редактора игры Titan Quest.

При рисовании текстурой по ландшафту происходит пересчет соответствующей ей карты прозрачности. А так как сумма всех степеней прозрачности должна составлять 100%, карты прозрачности всех остальных слоев нормализуются. Как это выглядит в самом редакторе можно посмотреть на коротком видео.

Читайте так же:
Incanto размерная сетка боди

Unity3D: как создать недеформируемую текстуру?

Привет всем!
Делаю тестовые уровни к 3D игре. Стены сейчас покрыты текстурой содержащей шахматные клетки. Если я растягиваю модель стены, то и текстура растягивается. Вопрос такой: как лучше сделать так чтобы текстура не деформировалась? У меня была идея прикреплять к каждой модели стены скрипт, который следит за размерами объекта и передаёт эти данные в шейдер. Скрипт должен будет работать в едитор моде. Но это как-то заморочено. Может ли шейдер сам учитывать деформацию меша?

wrapmode
может
скрипт может тоже
кури маны

Спасибо Александр, но скриптов пытаюсь как раз избежать. Вы предложили тот вариант, что мне известен, но не подходит.
Я так и не сообразил, похоже без скрипта это невозможно сделать. Или возможно.
И вам bool спасибо за не равнодушие)

Alerr
Смотри. Вариантов три:
1) не решать эту задачу
2) если можно все считать в шейдере, не меняя входных данных — скрипт не нужен
3) если нужно менять входные данные — скрипт нужен
Просто же?

Alerr
> Может ли шейдер сам учитывать деформацию меша?

Может, если напишешь соответствующий шейдер.

Executor, руками подкручивать параметры этого шейдера для каждого материала в моей задаче не вариант. Этот ответ, на сколько я понял, схож с вариантом (2) от bool. Я не вижу как в шейдере можно оценить расстояния между соседними вершинами для того чтобы просчитывать как сжать-растягивать текстуру.

Alerr
у тебя меш меняется динамически? если нет, то можно один раз посчитать и поскейлить текстуру и записать уже скоректированные текстурные координаты в меш. Можно, допустим, заюзать 2-3 канала координат и делать лерп между ними в зависимости от какого-то коэффициента. Короче, все сильно зависит от задачи, которую ты решаешь. Бывает так, что вот прямо нужно конкретный шейдер написать для одного вида объектов, и даже скрипт к нему. Это нормально. Если хочешь более развернутых советов/примеров, опиши задачу.

Опишу задачу подробнее. У меня есть куча стен, кубов. Я ищу способ того как дать всем этим объектам один материал такой, что текстура на этих разных объектах не будет растянута. Нужно чтобы она была repeat и чтобы не растягивалась "на меше".

>как создать недеформируемую текстуру?

Ну я аж заинтересовался. Палюбаху новая технология, думаю.
Открываю. Вах. Можно закрывать.

>Я ищу способ того как дать всем этим объектам один материал такой, что текстура на этих разных объектах не будет растянута.

Дай две секунды подумать.
У объекта наверняка есть bounding box. Пишешь шейдер, скалящий текстуру в зависимости от размеров. Для базового класса кидаешь этот шейдер, а также пишешь скриптик, который при создании GameObject находит BB и подставляет коэффициенты для шейдера.

Alerr— а ведь вместо тебя в ВУЗе мог учиться нормальный парень и будущий программист. Подумай об этом.

CasDev, я уж усомнился в том, что написал в вопросе, что не нужно использовать скрипт. Перепроверил даже. Потом ещё об этом писал в сообщениях. Нет, народ, ну НЕ НУЖНО советовать варианты, которые автор отметает. Я же писал что не нужно крепить скрипт, шейдер без скрипта сам может справиться с задачей, существует такая технология? Может можно как-то в шейдере БЕЗ СКРИПТА получить доступ к вершинам меша?

Читайте так же:
Как сшить покрывало расчет ткани

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

Alerr
> существует такая технология?
Да. World-Space UV Mapping.

каким шейдером рисуется сейчас?
там достаточно 1 строку добавить — вычислять uv по pos, типа

Leonardo98, о том как поскейлить и как репеат включить я в курсе, но спасибо) Пока нечего в шейдере показывать, он как бы стандартный совсем, единственная особенность — перепросчет координат сейчас не реализована.
Спасибо Barabus, обмозгую

Создание стилизованного окружения в Unity

Sergey Tenditniy про используемые им методы создания своих выдающихся модульных игровых окружений в Unity.

Перевод статьи с портала 80 level

Добрый день, меня зовут Сергей, я родом из Украины, но последние 3 года живу в красивой стране Словении.

Последним моим местом работы в Украине была компания Wargaming.net, я работал как 3d художник и менеджер по продажам над проектами World of Tanks и World of Warplanes. В Словении я начал работать с созданием окружений в среде Unity, затем у меня появилась идея создать этот мультяшный городок.

Идея

Желание сделать такой городок появилось у меня в прошлом году, когда мы с моей женой путешествовали по Эльзасу во Франции. Это очень красивая область этой страны, с большим количеством живописных городков и местечек. Я был в восторге от красоты и уникального стиля, которые там меня окружали.

Именно тогда меня посетила идея сделать что-то подобное в виртуальной среде, ведь если люди с удовольствием посещают такие места в реальности, то и виртуальное путешествие будет кому- то интересно.

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

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

Сначала я не предполагал продавать этот проект на площадке Unity Asset Store. Чуть позже я пришел к выводу, что правильнее будет создать целостное игровое окружение, а не просто сцену для красивого рендера. Мне хочется чтобы люди могли использовать созданное мной в своих собственных проектах.

Основные фото–референсы, сделанные мной во Франции:

Моделинг

Первые скриншоты по ходу этапов работы:

Основные этапы рабочего процесса:

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

2. Далее я добавил имеющимся домикам больше деталей и создал несколько новых.

3. Мной были выбраны два домика и церковь для экспериментирования с сочетанием цветов, важно было понять то, как они будут выглядеть по завершению работы. Была добавлена временная зеленая растительность.

4. Добавлен окончательный набор растительности. Проведена чистовая проработка детализации домиков. Настроено освещение и пост-процессинг. Уже практически готов финальный вид части моего городка. Это послужило мне стилевым и цветовым референсом при проработке остальных улиц и ассетов.

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

Читайте так же:
Как сшить юбку хризантему из фатина со шлейфом

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

На рисунке вы видите, как он выглядит, и из каких элементов собран:

Все элементы:

Поликаунт:

Я использую модели со средним количеством полигонов без использования запекания нормалей, в углах есть вставки, которые хоть и увеличивают количество полигонов, но при этом дают возможность использования текстур с «тайлингом», вертексы в углах используются для вертексного альфа – смешения и вертексного цветового смешения.

Создаем ассеты

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

Сначала создается базовая форма из простых мешей, затем только можно переходить к деталям. Следите за тем чтобы модель смотрелась интересно и «читабельно» со всех сторон, если все нормально, то можно приступать к детализации. При этом важно соблюдать баланс, старайтесь не перенасытить композицию малоразмерными элементами, это создает визуальный шум и делает ассет менее «читабельным» и выразительным для игрока или зрителя.

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

Растительность

Растительность создавалась очень просто. Ничего нового:

1. Первым делом я создал высокополигональный лист.

2. Использовал запекание нормалей и прозрачность.

3. Затем немного изменил его и с помощью клонирования создал всю ветку.

4. Для создания дерева использовал сферы, затем добавил ранее созданные ветки.

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

Для оптимизации всем листьям можно задать одинаковую текстуру. Нужно обеспечить разнообразие цветов использованием vertex color для листьев, сделать их немного более красными или желтыми.

Подобным образом я создал всю растительность, начиная от самой маленькой 3d веточки. Так, можно легко создавать кустарники и даже плющи.

Текстурирование

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

Были использованы пять основных текстур для создания окружения: бетон, древесина, металл, черепица и листва.

Эти 5 текстур использованы на 95% поверхности того, что вы перед собой видите. Также я использовал текстуры в градациях серого для возможности добавления цвета с использованием vertex color в Unity, всё разнообразие цветов, грязь и потертости древесины я добавил, используя функционал vertex color texture blending с использованием vertex alpha. Я использовал специальный шейдер, созданный в Shader forge, он дал мне возможность смешения с использованием vertex alpha и одновременно overlay vertex color поверх текстур с использованием градаций серого.

Читайте так же:
Как сшить обувь для гнома выкройка

На этом изображении вы видите, что я использовал только 4 материала для оформления домиков (древесина, бетон, черепица, стекло), но так, как я использовал vertex color – композиция выглядит интересной и достаточно разнообразной. Один цвет на изображении это один материал в игре.

Все разнообразие цвета создано с использованием vertex color, так каждый из этих домов в сцене может иметь уникальное сочетание цветов, одновременно, это очень не требовательно к ресурсам.

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

Этот стильный вид – результат использования полноцветных и насыщенных текстур, изогнутой геометрии объектов и пост-процессинга.

Инструменты

На первых этапах работы я применил vertex color в Maya, чтобы получить базовые цвета для домиков. А в среде Unity использовал инструмент vertex paint tool для добавления цветов. Из всего разнообразия я выбрал free face paint, при этом можно добавлять цвет сразу на весь полигон и это быстрее чем на каждый вертекс по отдельности. Если у Вас есть шейдер поддерживающий vertex color или смешение текстур, то можно прямо в сцене Unity очень быстро изменить общий вид ваших ассетов.

Вы можете посмотреть, как я это реализовал на этих изображениях:

Освещение

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

Я использовал только real-time направленный свет в этой сцене. Для всего непрямого освещения использовались стандартные средства Unity.

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

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

Также нужно наметить разделение заднего плана от переднего используя стандартный туман Unity. Ощущение солнечного дня создает контраст между затененными и освещенными зонами.

Все остальное сделано с помощью пост-эффектов.

Пост-процессинг

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

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

Заключение

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

С соответствующей настройкой уровня детализации (LOD) можно получить большое количество элементов детализации переднего плана, а также упростить их для использования на заднем плане. Основные малоразмерные элементы в нашем проекте это растительность, но учитывая то, что при ее создании мы использовали один материал и она состоит из плоских элементов, то правильное использование static batching в Unity сэкономит нам миллионы используемых тут полигонов.

Я не могу точно указать количество часов, потраченное на создание этого окружения, так как занимался им в свободное время после полного рабочего дня. Но, я думаю это более 200 часов в процессе работы от идеи до готового проекта окружения.

Читайте так же:
Сшить сумку чем укрепить

В unity 3d, как добавить текстуру к объекту 3d(.fbx )?

enter image description here

В unity 3d, как добавить текстуру к объекту 3d(.fbx )? Перетаскивание материала с текстурой на объект 3d работает для объекта по умолчанию(eg:cube), но не для загруженных объектов 3d(зонтик)? Я мог получить только цвет, но не текстуру.

2 ответа

  • 3d FBX импорт файлов в Unity не работает должным образом

Я заинтересован в создании приложений виртуальной реальности и нахожусь на начальном уровне. Я импортировал файл FBX самолета и импортировал его в Unity, связав анимацию в Unity и построив ее на своем мобильном телефоне, я вижу версию модели 2D. Как я должен преобразовать его в приложение.

У меня есть требование отобразить интерактивную модель 3D (клиент предоставляет несколько файлов FBX) на одном из экранов в родном приложении Objective-C/Swift. Я знаю, что есть возможность работать с Unity/Cocos3D, но тогда все приложение должно быть основано на Unity/Cocos3D. В моем случае.

если вы добавляете fbx в проект, последовательность будет

  1. Сначала добавьте текстуры
  2. Затем модели.

Если вы хотите применить текстуру к объекту 3D, ему нужна карта UV. Например, в blender : https://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/UV_Map_Basics

Я думаю, это именно то, чего ты хочешь.

Похожие вопросы:

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

Я пытаюсь импортировать .ply в Unity 3D с цветами вершин каким-либо образом для этого? Я не знаю, как конвертировать файл .ply в .obj, .dae или .fbx. В качестве примера должен быть способ сделать.

У меня возникла проблема с текстурированием объекта в Unity 3D. Я сделал простой объект в 3Ds Max и вставил его в Unity, а затем попытался применить изображение в качестве текстуры, но оно не.

Я заинтересован в создании приложений виртуальной реальности и нахожусь на начальном уровне. Я импортировал файл FBX самолета и импортировал его в Unity, связав анимацию в Unity и построив ее на.

У меня есть требование отобразить интерактивную модель 3D (клиент предоставляет несколько файлов FBX) на одном из экранов в родном приложении Objective-C/Swift. Я знаю, что есть возможность работать.

Я играю с Unity уже 6 месяцев, так что я не expert. Я пытаюсь разработать приложение, с помощью которого можно выбрать модель 3D (механический чертеж в формате .fbx) из списка, импортировать ее и.

Я работаю над проектом aframe, где 3D объектов загружаются из .obj файлов. Однако raycaster не будет работать с импортированными объектами. Я подозреваю, что причина в том, что в отличие от.

Я разрабатываю приложение AR и импортирую файл FBX, содержащий два объекта 3d внутри (у меня не может быть двух отдельных файлов fbx, потому что объекты взаимодействуют друг с другом с анимацией).

У меня есть вопрос о моделях 3D в Unity (Unity 2018.3). Как я могу применить текстуру только к одной части всей модели 3D? Потому что я скачал некоторые модели 3D из интернета (без авторских прав, и.

голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector