Реально ли написать шейдер из примера, не обучаясь шейдерному делу?
Мне понравился пример шейдера на юнити, но тут не весь код,
вообще по этому примеру насколько легко написать шейдер, если знаешь основы шейдерства?
Потому-что для меня это как ассемблер, очень сложно
и непонятно в какие функции вставлять это, и в каком порядке это всё должно быть?!
Но так хочется симуляцию ветра в пиксельарте.
- 13 марта 2020, 15:40
- 00
Я тут как раз графоний пытаюсь осилить в пиксельарте,
в идеале бы ещё псевдосимуляцию ветра( но увы с шейдрами вообще никак не знаком.
Почему ты избегаешь изучения вопроса? По своему опыту скажу, что намного проще разобраться в чем-то и спокойно делать, чем пытаться срезать углы и просто использовать готовое решение без понимания. Хотя кажется, что наоборот.
Посмотри, к примеру - https://thebookofshaders.com/
Я просто не понимаю концепцию, хотя другие языки легко осваиваю. Наверное тут дело в геометрии и понимании этих непонятных формул, которые я со школы не понимаю, у меня это на уровне "смотрю в книгу - вижу фигу". Пробовал разные уроки читать для новичков, и даже там не понимал концепцию шейдеров, там сразу слишком сложно наверное для тех кто шарит в высшей математике или геометрии/алгебре, а я в этих дисциплинах никогда не мог разобраться. Хотя мне нравится программировать, но я редко сталкивался с математикой, кроме, синусов косинусов и других небольших подобных мелочей, но не более.
PS Спасибо за ссылку.
Попробуй прост сесть и разобрать самостоятельно чьи-то простые шейдеры.
ну так в твоём примере даже синусов-косинусов нет)
Реально ли разобраться не разбираясь?
Разберись - не поленись!
Я уже пробовал, но как будто читаешь совершенно другую концепцию, как будто ассемблер, а не обычный язык программирования, даже не знаю с чем ещё сравнить. Многие незнакомые языки могу легко понять, просто взглянув на текст, но тут эти формулы, и вообще структура, всё такое незнакомое, как совершенно иной подход.
Ленись! Не разберись!
У нас тут недавно была статья про шейдеры.
Я как-то полистал немного статью. Добавил на потом почитать и разобраться лучше.
Где-то я читал, что шейдеры на разных языках и движках отличаются, потому даже не знаю как сильно отличается это от юнити и пока не стал изучать, в гамаке я пока только основы изучаю, до шейдеров не скоро дойду.
Сейчас уже в цивилизованных* движках визуальные шейдеры (блоки и между ними натягиваешь лапшу), они как раз для художников (и не только, так как в принципе визуальная работа в визуальном виде хорошо идёт) :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, конечно в эру крутых компов мы перестали париться об этом, но я бы не стал отсекать аудиторию со слабыми ПК
не пробовал но предполагаю что одна транспарент-плашка на слой сожрет гораздо меньше ресурсов чем шейдер расчитывающий туман на всем протяжении до объекта. а простым смещением текстуры на ней ты еще и обеспечишь движение удобных тебе клубов тумана
Я просто думал что туман жрёт меньше ресурсов, чем дополнительные спрайты.
Ну тут как бы туман своими руками.
Если не понимать, по какому принципу шейдер работает, то неважно, пишется ли он кодом или визуальными компонентами - хрен не сделаешь.
Но в визуальном научишься прямо по ходу работы.
Я же писал стать про шейдеры недавно =)
Тут нет никакого ассмемблера. По крайей мере GLSL (а он почти везде используется и в юнити скорее всего) - это СИ-подобный язык. Синтаксис, функции и макросы - всё как в Си.
Смысл шейдера - обработать пиксель. Ты знаешь его цвет в виде четвёрки значений RGB+alpha и его координаты в текстуре. Ты можешь передавать в шейдер другие значения - числа, массивы и даже текстуры и как-то их вплетать в рассчёты. Таким образом, в шейдере ты пересчитываешь цвет пикселя, который обрабатываешь и возвращаешь его.
Например, у тебя есть две текстуры, которые ты хочешь как-то смешать. В шейдер у тебя попадает текущая текстура и по ней происхорит обработка. Ты можешь взять цвет текущего пикселя с этой текстуры, ты можешь взять цвет пикселя с другой текстуры по тем же самым координатам. В любом случае, у тебя будут значения RGBA, которые ты можешь смешать. Например, ты можешь взять среднее значением между ними или как-то отфильтровать, получая тем самым эффекты наложения подобоно эффектам в фотошопе. А ещё ты можешь взять цвет соседнего пикселя в текстуре и использовать его - тем самым сделав что-то типа смещения (как я понял шейдер в сабже как-то так и работает). Тут важно понимать что у тебя текстура попиксельно обрабатывается и то что ты пишешь в шейдере - это то что обработает и выплюнет цвет одного конкретного пикселя, но у тебя при этом есть контекст о других пикселях в текстуры, и ты можешь использовать его чтоюы достичь крутых эффектов.
А набор функций в шейдерах довольно примитимный. Вот для GLSL, например:
http://www.shaderific.com/glsl-functions
Это все возможные функции, ага =) Простые математчиеские функции типа минимума, максимума, косинуса, синуса, ну и немного векторных функций. Во многом просто чтобы работать с цветом и координатами как с векторами, а не писать на каждую компоненту свою строчку кода. Кстати, тут нет функции рандома, например, так что в примерах довольно много обвеса делается для его имитации. Или для обсчёта ячеек Вороного (очень популярный алгоритм)
Все формулы по шейдерам - это пересчёты координат и цвета, и тут, да - сложно понять концепцию. Дело не столько в математике, сколько в вычислениях и алгоритмах. Всё это приходит только с опытом, т.е. прочитав пару книжек - хер что ты напишешь.
Вывод - если хочешь писать шейдеры сам, то нужно засесть за это всёрьез и достаточно надолго, тренируясь, начав с очень простых примеров и постоянно экспериментируя. Мне очень сильно помогает Shadertoy в этом плане.
вот кстати пробовал копипастить из твоей статьи но толи я где-то на косячил, толи в гмс 1.49 это работает где-то по другому...
Видимо стоит юзать готовые исходники, а не копипастить. Сейчас все эти системы такие шаткие, что лучше опираться на целые готовые блоки кода, чем что-то мудрить по запчастям.
копипастил в смысле всё, от и до. включая вызов... но пологаю гмс 2 с шейдерами работает по иному...
в результате подобрал таки тонну блендмодов которые в купе сюрфейсами давали мохожий на нужный эффект... но это не особо то конечно)
Я имею в виду, что Хейзеру стоило выложить готовый исходник, чтоб говорить понятно о каком коде, работает он или нет.
В GMS1.4 шейдеры могут работать по-другому. Возможно там были поменяны названия встроенных пременных, но не могу гарантировать на все 100%. Когда я свой SIG.null портировал с 1.4 на 2, вроде что-то менял в шейдерах, т.к. оно не работало корректно.
Спасибо) и надо посмотреть что за Shadertoy такой.
Попробую ещё раз понять суть шейдеров, может оно не так сложно.