Механика “мытья”. Render Target UE
Привет всем! Пришло время ворваться на ДТФ с новыми полезностями. Сегодня речь пойдет про Render Target, материалы, немного blueprints.
Базовых знаний движка должно хватить, чтобы усвоить материал.
Render Target
Что же это за зверь такой, этот ваш таргет? Если совсем просто, то это процедурная текстура, которую можно редактировать во время выполнения программы. Не стало понятнее? Тогда давайте на примерах.
С помощью RT вы можете проецировать изображение с камеры, на текстуру. Таким образом и делали зеркала. Проблема в том, что вместо одного рендера кадра, у нас их будет 2. Соответственно, если совсем упростить, то и fps в 2 раза меньше. Вот и раскрыта тайна технологии предтеч. А заодно и причина отказа, от подобной фичи.
Что там еще интересного с процедурной текстурой можно придумать? Симуляцию жидкости тоже имитировали с помощью RT. Вся интерактивная водичка делалась(делается) с помощью RT.
Ну а мы рассмотрим самый тривиальный вариант использования. Сделаем рисовалку внутри UE. Рисовать будем маски для материалов. Пригодится это во всевозможных симуляторах уборщиков, которых последнее время стало просто невообразимое количество. Ну или если кто-то в детстве мечтал нарисовать послание на соседском заборе, но ввиду строгости родителей, гештальт так и не был закрыт.
Запускаем UE. Движок нам предлагает два варианта создания RT. Заранее, до запуска выполнения игры, разместить RT в директории, либо создать ее во время выполнения. Нам больше интересен вариант создания в реальном времени, так как стен в игре может быть несколько.
Давайте для начала создадим простой материал.
Держим в уме, что RT это ни что иное, как текстура. Соответственно нам и нужна переменная с текстурой. Позже мы передадим в эту переменную наш RT.
Дальше нам необходим актор, который и будет содержать меш, по которому мы будем рисовать, а так же наш RT. Создаем актор. Нам нужно создать RT. К счастью эпики позаботились о “дизайнерах” и в blueprint есть возможность поработать c RT.
Не выбирайте слишком большое разрешение, все же эта технология не из дешевых. Отталкивайтесь от размеров объекта и от дистанции до камеры игрока. Слишком малое - и кроме квадратных пикселей вы ничего не рассмотрите, слишком большое и вы положите производительность.
Итак, мы создали RT. Необходимо передать ее как параметр в наш материал.
Создаем инстанс материала. Передаем RT в качестве текстуры в параметр материала. На нашу экспериментальную плоскость вешаем наш новый инстанс материала.
Как же рисовать по нашей плоскости? Создадим функцию Draw, которую будем вызывать каждый раз, когда захотим что-то нарисовать. В качестве входного параметра используем Vector 2d. Он нам пригодиться, чтобы понять, где нам нужно рисовать. Достаем RT и вызываем Begin Draw Canvas To Render Target.
Итак у нас есть целая куча вариантов, чем же мы будем рисовать по нашему RT. Мы будем использовать рисование с помощью материала. В итоге у нас должна получиться вот такая конструкция. Не забываем в конце функции закончить рисовать, вызовом End Draw Canvas to Render Target.
Draw Location мы будем передавать из вне. Умножаем его на размер холста, чтобы получить позицию, где нам нужно нанести “мазок” нашим материалом. Половину размера кисти мы отнимаем, чтобы получить центр позиции нашей кисти. Нужно создать какой-то материал которым мы и будем рисовать.
Передаем этот материал в качестве параметра в нашей ноде Draw Material.
Отлично! Мы почти у цели. Осталось разобраться с расчетом позиции, где мы собираемся рисовать. Тут в зависимости от задачи можно подходить по разному к этой проблеме. В целях демонстрации мне подойдет Line Trace, который я буду бросать от камеры в сторону курсора. Изначально я планировал использовать Get Hit Result Under Cursor by Channel. Но по неведомой для меня причине, это не сработало. В итоге пришлось бросать трейс за курсор. В реальном проекте, скорее всего вы будете красить или мыть каким-то устройством или инструментом, соответственно вычисление позиции будет иным, но это не должно вызвать сложностей.
Обратите внимание на галочку Trace Complex и на функцию Find Collision UV. У вас эта функция будет недоступна, для ее активации в настройках проекта необходимо включить Support UV From Hit Result.
Результаты мы передаем нашему тестовому актору вызовом функции, которую мы только что создали. И наконец-то смотрим результат!
Ну вот и все! Гештальт почти закрыт!
Навернув красоты, усложнив материал и накидав декалей с помощью ниагары мы получим что-то более интересное.
Никаких сложных приемов. RT в качестве маски, который интерполирует между загрязненным материалом и чистым. Помним, что маску можно использовать не только для цвета, но и для дополнительных параметров, например для металличности и шероховатости.
Заключение(ОСТОРОЖНО РЕКЛАМА!!!)
Я анонсировал свою новую игру! Это не большой симулятор кухни на колесах. Если вам интересно или вы хотите меня поддержать, добавляйте игру в вишлист стим! Кто нажмет заветную кнопочку, тому будет сопутствовать удача!
Подготовлена следующая статья, про анимации в материале - Sine+Time. Выход планирую завтра. (!!!!АХТУНГ - ОПЯТЬ РЕКЛАМА!!!)