Реально ли написать шейдер из примера, не обучаясь шейдерному делу?
Мне понравился пример шейдера на юнити, но тут не весь код,
вообще по этому примеру насколько легко написать шейдер, если знаешь основы шейдерства?
Потому-что для меня это как ассемблер, очень сложно
и непонятно в какие функции вставлять это, и в каком порядке это всё должно быть?!
Но так хочется симуляцию ветра в пиксельарте.
- 13 марта 2020, 15:40
- 00
Сейчас уже в цивилизованных* движках визуальные шейдеры (блоки и между ними натягиваешь лапшу), они как раз для художников (и не только, так как в принципе визуальная работа в визуальном виде хорошо идёт) :D
* унреал, годот и юнити, как минимум
Видел я эти паутины и лапшу) возможно это легче, чем кодом писать, но почему-то не могу никак уловить концепцию, пытался по примерам в Blender собирать, пока собираю точно по уроку, то всё хорошо.
Как пытаюсь сам что-то собрать из кубиков вообще никак не могу)
Между прочим ты зря так, я как-то попробовал и это реальная штука. Да, лапша. Да, куча непонятных блоков. Да, неясно как влияют связи и порядок блоков, но это всяко лучше чем код, который вразы непонятней. Для художников и непрограмиистов очень хороший инструмент.
И да, отвечая на вопрос - свой шейдер ты не напишешь если не будешь знать основы.
Да я примерно так и понял, просто думал может кто за минуту просто расскажет, куда копировать эти строки, лол, иначе придётся опять потратить кучу времени на изучение нового языка)
Ещё я не уверен одинаков ли этот язык для разных движков, одинаково ли это для юнити и гейм мейкера и годота? А то получается для каждого движка нужно снова всё это изучать
Какие строки копировать? Их ведь еще нужно куда-то вставлять? Знать бы еще как они работают, правда? А то ведь можно хотеть разлитающиеся разноцветные частицы по всему экрану, а получить черный экран. Если не понимать сам принцип работы шейдера, простой копи-пастой ничего путного не выйдет. Ты уж мало-мальски должОн это понимать.
И да, для разных движков он очень разный, у юнити это своя лабудень жестко привязанная к движку, а вот у GMS и Godot синтаксис примерно одинаков. И для них легко перекидывать код с шейдертойс и прочих ресурсов, с какими-то очень минимальными изменениями.
У меня раньше получалось из пару шейдеров сделать один) путём методом проб и ошибок копипасты)
Но там я по крайней мере видел целые блоки, а тут даже не понятно куда это вставлять в какой блок)
Сколько я не пытался, но до сих пор не понял концепцию шейдеров, в отличии от обычных языков.
http://www.unity3d.ru/distribution/viewtopic.php?f=35&t=24905
Спасибо!
А мне в целом понятно что в этом шейдере из сабжа куда вставлять. Непонятно что в качестве displace текстур использовать.
Собсно там тебе тело функции main описано. Ну uv нужно либо вручную посчитать либо взять из входных шейдра (в GMS это texCcoords)
Потом то что написано
1) Взять пиксель с текстуры смещения
2) Посчитать само смещение
3) И с нужной текстуры брать этот пиксель с учётом посчитанного смещения
4) Крутить текстуру смещения для динамики. Это можно в рассчёте uv добавлять таймер к координатам
Во втором блоке сказано что можно юзать две текстуры смещения. По сути сделать п1 и п2 из предыдущего блока для новой текстуры и по приведённой формуле посчитать итогове смещение
В тертьем блоке говорится что можно добавить ещё одну маску, которая будет влиять на степень смещения пикселей, например чтобы на дереве в каких-то местах листья сильнее шевелились чем в других. И снова приводится блок кода как это сделать.
В четвёртом блоке говорится как сделать Pixel-perfect и снова строчки кода как этого добиться.
Вроде всё понятно если немного в контексте шейдеров. Т.е. понимаешь как он работает и чё делают основные функции.
Спасибо!
Не уверен смогу ли собрать шейдер из этой информации, но попробую.
Ещё по части "texCcoords", а можно у шейдера взять реальные координаты объекта, а не только координаты текстуры?
Ну например местоположение вершины. Я тут просто думаю как сделать туман в ортографической перспективе, и например в юнити не работает туман с ортографической камерой, но если бы можно
было взять ось Z и "затенить" туманом текстуру на основе её (только как, хз. Адекватный бы учебник для полных нубов по шейдерам, прям совсем у кого по нулям с пониманием, как у меня.) ),
Нет. Только если ты сам их передашь шейдеру перед отрисовкой.
В Юнити есть fog в настройках графики. Или он не работает?
Можно просто закрепить перед камерой плашек с текстурами разной прозрачности на разном расстоянии.
Но там же перед пиксельным вершинный шейдер отрабатывает. Нельзя эту инфу выудить и передеать в пиксельный?
Я ХЗ, т.к. в вершинных я вообше не силён, смутно понимаю зачем они нужны и не понимаю как они работают. Там стереометрия 80лвл =(
Он же не с реальными координатами работает.
А вот не факт. Например, туман учитывается именно в вершинном шейдере, это напрямую связано с отдальем объекта от камеры, что как я понял и нужно. Значит как это отдаление можно узнать чтобы проинтерполировать в вершинном шейдере.
На входе вершинного шейдера - координаты вершины в пространстве сцены, на выходе - экранные координаты. Так что что бы ни считать "реальными", скорее всего в шейдере они есть.
Пруфы в студию господа, чтобы не быть голословными...
Такой пруф пойдет?
Или что ты имеешь в виду? Что перед попаданием в вершинный шейдер координаты еще на что-то умножаются?
Вершинный выполняется один раз на каждую вершину, пиксельный - один раз на каждый пиксель. В вершинном можно подменить координату вершины, а в пискельном - цвет и прозрачность пискеля. Это если вкратце.
Координаты UV передаются из вершинного шейдера в пиксельный через переменную типа varying, которая осуществляет интерполяцию UV-координат для всех пикселей. То есть в вершинном шейдере в неё идёт значение UV для каждой вершины, а в пиксельном из неё берётся уже растянутое равномерно по полигону (наподобие градиента) значение UV.
В шейдере можно работать в любом пространстве координат, хоть в мировом, хоть в локальном, хоть в экранном. Для перевода между ними используются соответствующие матрицы.
Но с UV там есть нюанс, что если не знаешь соотношение сторон спрайта, то не сможешь перейти в другие координаты, поэтому это соотношение надо передавать самому (или не его, а сами координаты уже посчитанные). Не помню, с чем это точно связано, так как шейдеры последний раз открывал давно... (то же самое про глубину, касался только слегка и уже забыл, как работать с буфером глубины в шейдерах).
плашки кушают ресурсы нехило, чем больше, тем хуже FPS, конечно в эру крутых компов мы перестали париться об этом, но я бы не стал отсекать аудиторию со слабыми ПК
не пробовал но предполагаю что одна транспарент-плашка на слой сожрет гораздо меньше ресурсов чем шейдер расчитывающий туман на всем протяжении до объекта. а простым смещением текстуры на ней ты еще и обеспечишь движение удобных тебе клубов тумана
Я просто думал что туман жрёт меньше ресурсов, чем дополнительные спрайты.
Ну тут как бы туман своими руками.
Если не понимать, по какому принципу шейдер работает, то неважно, пишется ли он кодом или визуальными компонентами - хрен не сделаешь.
Но в визуальном научишься прямо по ходу работы.