Дырявый материал в Godot
Объясняю на пальцах, как сделать дырявый материал в Godot 4.x и показываю примеры применения, вдобавок – как вообще пользоваться сабвьюпортом и рендерить его в шейдер.
Текстовую версию не прилагаю, это просто мини-демонстрация на 20 минут, там смотреть надо.
Вряд ли это кому-то интересно кроме годотеров будет, но если пригодится кому-либо, буду рад :)
Если хотите, можете вступить в группу в телеге, там помогают беднягам в освоении движка. Если не хотите, то можете не вступать: https://t.me/godot_help_ru
Godot. Градиентные переливы)
Всем привет, давно ничего не постил, вечно некогда)
Странное название, но я хз как это назвать ещё, но вот пример, это по работе делал анимашку пока идет поиск противника, про партиклы тут вроде особо нечего рассказывать, уже и так эти моменты пояснял, а вот фон на заднем плане, раньше не знал как сделать подобное, долго голову ломал)) Но нашел решение)
Ну в целом, мне кажется можно проще решение найти, но не хочется покадровую анимацию, не знаю, думаю ещё пока, но в целом этот задник сделан шейдером. И кому интересно я записал видос, как подобного плана делать эффекты, можно и лучше сделать конечно, я ещё только учусь, но базовой концепцией поделюсь) Может пригодится кому)
Может не все хорошо получилось, вернусь ещё к этой теме, можно и партиклами добиться примерно такого-же эффекта. Посмотрим ещё.
Спасибо, за внимание.
Godot. Путь к основам VFX. Пишем свой outline shader. Ч2
День добрый, уважаемые любители Godot'a. Продолжу мучать шейдер. Начало тут
Godot. Путь к основам VFX. Пишем свой outline shader. Ч1
Напомню на чем остановились, кому интересно это, те наверняка и так увидели проблему, кто поленивее, тем сейчас покажу.
Вот как получается на больших значениях.
Почему так происходит и что это за хрень вообще, на самом деле все очень просто)
В это части и будем это исправлять, тут вообще никакой беды нету и это вобще не значит что это плохой или неправильный код, он просто не нужен для этой задачи, но для понимания как работают шейдеры, он очень даже хорош. Бонусом покажу, что можно замутить из этого казалось бы неправильного кода.
Как видите мы вполне научились делать копию картинки с помощью шейдера, а этого знания уже достаточно чтобы запилить например аналог reflected image из Baldurs Gate
Ну или например для какого-нибудь блинка или фазового смещения можно оставлять шлейф за персонажем, после резкого перемещения. Конечно это можно сделать и создавая копии картинки с помощью gdscript, но зачем нагружать ЦП и память, если можно это переложить на видяху, да и кода будет существенно меньше)
Ну да ладно, если кому это надо и интересно, так напишите в комментах после этой части можно в принципе запилить серию и сделать такой эффект, чтобы можно было его применять в игрушечке сразу.
Вернемся к аутлайну, уже видно что текущий вариант совершенно не годится, если значения превышают какие-то лимиты, да и смещение идет только по горизонтали и вертикали. Все варианты которые я смотрел, так или иначе схожие по смыслу, хоть и разные по реализации. Ну и посетила голову мысль случайная, зачем вообще все это городить, если по сути можно отскейлить картинку до нужного размера, вычесть из отскейленной текущие цвета и получим нужный результат по сути. Так и поступлю пожалуй).
В снипетах есть готовый код скейла его и возьму.
https://godotshaders.com/snippet/scale/
Вставим это дело в шейдер и вычтем исходную картинку.
Ну теперь дело осталось за малым, надо всего лишь покрасить большую картинку цветом из параметров и вернуть назад, исходную картинку.
Ну вот получили нужный результат без всяких проблем с тем больше или меньше картинка.
Тут остается ещё ряд проблем, но велосипед потихоньку начинает ехать и нужный результат становится все ближе и ближе. В следующей части будет разбор как сделать градиентную заливку.
Спасибо за внимание.
Неожиданный эффектик
Вообще конечно собирался доделать цепную молнию, но неожиданно получилась такая прелесть, короче надо подумать над классом чернокнижника.
Дорогие подписчики, есть вопрос, о чем лучше написать? Вариантов два или сделать боевку максимально похожую на Disciples, подробненько распишу все или дальше про эффектики продолжать?
Завтра целый день свободный, надо что-нибудь запилить. Вообще конечно посещает меня крамольная мысль, перебраться на UE4, ну тут надо подумать ещё) Носит с одного на другое вечно.
Godot путь новичка. Добавим красок блеклой анимашке. Шейдеры ч3
Добрый вечер, мои дорогие подписчики. Это продолжение поста Godot путь новичка. Шейдер ч.2 Буду сейчас может понемножку, но чаще писать. Поймал себя на мысли, что у меня работа над своим проектом движется только тогда, когда пост дописываю. Сразу и у себя, написанное в посте, допиливаю до приемлимого уровня. А мне уже порядком поднадоело находиться в статусе вечного неудачника с бесконечным проектом. Ладно с лирикой потом.
Будет очень немножко кода добавлено к прошлому посту, но по итогу анимация смерти будет выглядеть примерно так.
Нельзя не согласится, что выглядит существенно понаряднее, чем просто исчезающие пиксели.
Ладно приступим.
Да повторюсь ещё раз, условные операторы по идее нежелательно использовать, с другой стороны динамически однородные условия будут выполняться лишь с небольшими проблемами производительности, насколько мне удалось разобраться на текущий момент. Вобщем вспоминаем про принцип KISS и огромный ущерб от преждевременной оптимизации. Простенько? Да. Понятненький код? Тоже да. Так что все чудесненько.
Если прям вот надо надо, то могу переписать без использования if'ов, но мне без них кажется гораздо запутаннее и непонятнее.
Вот в принципе и всех делов пока.
Бонусом добавлю ещё такой простенький вариант.
Тут простор для поиграться ещё больше открывается, вот какой у меня результат. Я себе просто для черной каемки добавил, в своей разработке мне надо это для большего контраста. Как соберусь пост про освещение пилить, так нагляднее будет там видно)
На видосике это не артефакт остался, это остановил запись раньше чем анимация доигралась)
С шейдерами пока ненадолго закончу, дальше будет либо про Tween, либо про всплывающие цифры урона или про простые анимашки с партиклами.
Аниматоры качественные стоят дорого, энтузиастов не охота искать, чтобы не расстраивать их бесконечной разработкой ради разработки, а какие-то эффекты все одно нужны. Так что надо налепить чего-нить пободрее, да попроще)
Всем спасибо за внимание, честно очень сильно подбадривает, что читаете. И вдвойне рад, если удается действительно полезной информацией делиться.
Godot путь новичка. Шейдер ч.2
Добрый вечер, мои дорогие подписчики. Это будет продолжение поста Godot путь новичка. Первый Enemy и первый Шейдер
Смотрел, как сын делал задание по прошлому посту, понял, что ему например, совсем не все понятно было. Постараюсь разъяснить в меру сил, ну и немножко доработать шейдер, в конце поста получится, примерно, следующая анимация.
Ну во первых, что такое UV - это развертка, по сути просто преобразование координат с трехмерного объекта в соответствующие координаты на текстуре, поскольку спрайт это двумерный объект, то все ещё проще и развертка соответствует самому спрайту, разве что координаты в UV идут от 0.0 до 1.0.
Очень наглядно демонстрируется это в туториалах Godot.
Ну добавим в шейдере ранее написанном, одну строчечку для наглядности ещё разок.
Вот ну думаю из этого уже можно догадаться, что белый цвет это значения всех каналов равны 1, а черный это когда цветов нет и значения всех каналов равны 0. Серый это смешение всех каналов в равной пропорции, чем ближе к 1 тем ярче цвет серого. Что это дает и зачем нужно, а так же какое отношение имеет к тому, что пиксели начинали пропадать. Как говорил, в прошлом посте функция random, дает случайные значения от 0.0 до 1.0, то есть по сути разные значения серого. Применим этот шум, к текущему спрайту, чтобы было понятнее о чем говорю.
Ну и собственно в прошлом посте увеличивая прогресс, сравнивали значение прогресса с этой невидимой картой шума и уже уменьшали альфу до нуля. Вот надеюсь стало понятнее, что к чему, да я сам новичок ещё в этих всех вещах, так что может не очень толково объясняю, но чему научился за пару месяцев, тем и пытаюсь поделиться, как просили)
Но просто рандом это дискретный набор случайностей, потому и выглядит как не пойми чего итоговый результат. Шум Перлина же в свою очередь, имеет градиентную основу, что позволяет делать более плавные и крутые штуки. https://ru.wikipedia.org/wiki/Шум_Перлина
вот гуглите про шум Перлина на здоровье, в детали алгоритма у меня влезать большого желания нет пока, но попользоваться им очень даже можно и нужно.
Смело топаем на godotshaders и в снипетах копируем шум перлина
https://godotshaders.com/snippet/2d-noise/
в целом это уже практически готовый шейдер, но он генерирует как бы это сказать, очень мягкий и смазанный шум, надо чтобы плотность шума была повыше. Ну и по аналогии с прошлым, заодно добавлю пару строчек, чтобы можно было посмотреть наглядно, что он там рисует то вообще.
на самом деле, шейдер полностью готов к использованию и даст результат такой же, как и в видяшке из начала поста. Но покажу, что именно рисует функция noise в зависимости от параметра density.
В принципе готов даже к неконструктивной критике, ибо влезаю в вещи которые сам не до конца ещё понимаю. Но работает же, учел ошибки прошлого поста, немножко разъяснил. К следующему посту, постараюсь максимально разобрать непонимание в этом, а заодно погляжу, как сын будет делать, чтобы самое непонятное высмотреть так сказать.
В любом случае, визуально эффект очень приятный, в следующем посте сделаю цветную линию, которая будет появляться перед исчезновением пикселя ну и дающая тот самый чудесный эффект, типа спрайтик плавится перед исчезновением. В целом думаю можете и сами догадаться, что надо просто параметр прогресс сравнивать не только с альфой, а добавить ещё один, чтобы разброс значений был чуть больше. Условно, если прогресс, 0.3, то все что меньше 0.3 то исчезает, а все что между 0.3 и 0.5, меняет цвет. Это и даст тот самый эффект, а можно по краешку пустить черную каемку, линию сделать красненькую и запилить эффект сгорающей бумаги. Ну это унесло меня опять, ладно поглядим что дальше получится.
Спасибо за внимание, надеюсь это разъяснит ещё чуть больше и вы начнете пилить крутые шейдеры и делиться своим практическим опытом в постах, а те кто уже опытные, те не будут писать, что все гавно и ты все делаешь не так. А подробненько изложат, как делать правильно, но не взрывая при этом мозг сложными материями.
Godot путь новичка. Первый Enemy и первый Шейдер
Добрый вечер мои дорогие подписчики, в прошлом посте сказал что постараюсь написать, про то как сделать первый шейдер, ну собственно и попробую. Шейдер будет очень простенький, но какая-никакая, а анимашка смерти, ну и чем проще тем понятнее думаю будет. А попозже уже модифицируем, до красивого. Можно сразу пролистать вниз, там есть результат, вдруг не понравится, так чтобы время зазря не терять на столько текста и картиночек)
Создам новый проект, основную сцену неважно, как назвать. Создам ещё одну сцену, назову её Enemy, сцена наследуется от Node2d скриншоты каждого шага делать не буду, их уже показывал ранее. На сцену Enemy добавляем ноду Sprite.
После того как спрайт выбрали, добавляем ноду TexturedButton, по размеру делаем её со спрайт, текстур к ней никаких не добавляем.
Для Enemy создаем новый скрипт, для кнопки соединяем сигнал pressed со скриптом Enemy.
Если на прошлом этапе никаких проблем не возникло, то значит все идет как надо, теперь немножко модифицируем скрипт Enemy.
Не буду выкладывать скрипт текстом, по сыну заметил, что если можно скопипастить, то обязательно скопипастит, а лучше 10 раз написать одно и тоже, пока не придет осознание, что надоело это уже писать, до чертиков. Вот как только появилась такая мысль, то все можно уже и копипастить.
Теперь можно потыкать врагов на экране, будут ложиться с трех тычек, очень даже неплохой баланс))
Ну раз враги умирают, неплохо бы это визуально показать игроку, что они действительно умерли и так и было задумано, а не просто пропали хрен пойми с чего.
Сделаем сначала очень простенькую штуку. А именно при смерти моба, будем уменьшать его прозрачность до нуля, как только прозрачность опустится до нуля, тогда будем вызывать destroy()
Ну все монстры исчезают, перейдем к мудреному, забамбасим простенький шейдер.
скину ссылки которые вам могут очень пригодится.
https://docs.godotengine.org/en/latest/tutorials/shaders/you...
https://docs.godotengine.org/en/latest/tutorials/shaders/sha...
https://godotshaders.com/
https://thebookofshaders.com/
Для понимания предыдущего, суперского туториала, нужно сказать пару слов, там используется GLSL, в godot свой язык шейдеров, но глобально это тот же самый GLSL. По следующей ссылке, детально расписано, как конвертить GLSL в godot'овский ну и так же обратно.
https://docs.godotengine.org/en/latest/tutorials/shaders/con...
функцию рандома взял отсюда https://godotshaders.com/snippet/random-value/
вообще черная магия какая-то и очень мне непонятная ещё местами, ну типа почему так сложно и где встроенная функция random(),
Генерит псевдослучайное значение между 0.0 и 1.0
Ладно погнали, назовем наш новый шейдер - desintegrate.
Тут не успеешь создать, уже сразу начинает ругаться, тут вобще на все подряд будет ругаться, можно забывать теперь про неявное указание типов данных и прочие радости, за каждую точку с запятой будет ругаться) Сучек, какой строгий) Ну сейчас он ругается, что не указали тип шейдера, использовать будем сейчас canvas_item, он для спрайтов. spatial для 3d моделек, до particles ещё не добрался пока.
Ну напишем шейдер, который сейчас полностью повторяет, тоже самое что делали через
self_modulate.
Все есть полностью рабочий шейдер, самое время его прикрутить к спрайту.
Как наиграетесь не забудьте progress перетащить на 0, хотя это и неважно, в последствии шейдер по умолчанию вряд-ли будет привязан к конкретному спрайту, а под разные смерти будут разные эффекты и шейдер проще будет задавать уже напрямую из даты монстра или оружия или магии, или что там в голову уже взбредет.
Теперь идем в скрипт Enemy.
Все можно проверять, работает точно так же как и до этого, но механика принципиально разная) Что уже круто, вставлять видяшку не буду и так пост огромный получается.
Ладно, чтобы немножко было отличий, модифицируем ещё разочек шейдер, не зря же его Desintegrate называли.
float random (vec2 uv) {
return fract(sin(dot(uv.xy,
vec2(12.9898,78.233))) * 43758.5453123);
}
берем эту функцию из сниппетов на https://godotshaders.com/snippet/random-value/Ну и результат.
Все большое спасибо за внимание, хз спонтанно как-то решился, пришел с работы да и навалякал за четыре часика, как есть. Надеюсь хоть что-то полезное отсюда подчерпнете, потому что я уже охреневать начал от обилия всего и не знал с чего начать. Подумал лучше уж хоть как-нибудь но побыстрее, а там видно будет в процессе. Следующий пост скорее всего будет про партиклы, а то если монстра бить, то от него что-нибудь и отлетать же должно, ну как получится. Сейчас по планам закодироваться снова, а то год трезвости прошел. Немножко тоскливо было, так я за месяц 4 раза нажрался. Но в запой не ушел, не особо и тянуло к слову, но все одно закодируюсь, чтобы соблазнов лишних не было)) а то опять ногу сломаю или бошку пробьют или ещё чего))



































