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