24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Реквестирую максимальную инфу по шейдерам, в частности по ShaderLab. Запилил несколько няшных шейдеров в ShaderForge, люто доставило, но, по личным ощущением, оно годится только для прототипирования, и после обкатки прототипа в связке с остальной игровой инфраструктурой необходимо переписывать уже руками. Слюни капают на UE4 и UDK с тамошним редактором шейдеров, но в силу обстоятельств вынужден использовать юнити, что, впрочем, не так уж и плохо. Помимо всего прочего, реквестирую советы шейдерокодеров по оптимизации. Сильно ли больно фреймрейту от if\else и прочей логики? Художники люто требуют максимальную унификацию, решение "Всё в одном" вместо десятка по-разному настроенных шейдеров. Это ли праведный путь, или стоит знать меру? К шейдерам вообще применимы паттерны? (глупый вопрос, наверное, но кодингом занимаюсь всего год и первым языком был C#, со всеми вытекающими. От структуры выдаваемого шейдерфорджем кода хочется плакать). И последний вопрос - наткнулся на описание стандартного шейдера в 5 юньке, и согласно ему при компиляции в билд всё неиспользуемое говно просто не компилируется в конечный билд. Могу ли я стандартными средствами unity сделать то же самое?
> Художники люто требуют максимальную унификацию Слать нахуй таких художников. Лень ему сменить шейдер в один клик, сука, хочет передавать гору ненужных данных туда-сюда. Отвечаю, сам artist, ебу в рот таких ленивых пидоров с претензиями.
>Сильно ли больно фреймрейту от if\else Во всех источниках пишут что сильно, сам не замерял. А вообще почти всегда можно извернуться и обойтись без этого.
>И последний вопрос - наткнулся на описание стандартного шейдера в 5 юньке, и согласно ему при компиляции в билд всё неиспользуемое говно просто не компилируется Если не ошибаюсь, все шейдеры ведут себя так-же в пятерке. А у дефолтного просто заебатый редактор, с галочками, выпадающими списками и т.д.
>>169772 >Если не ошибаюсь, все шейдеры ведут себя так-же в пятерке. А у дефолтного просто заебатый редактор, с галочками, выпадающими списками и т.д.
Все? Даже самописные? Если это так то я кончаю радугой.
Слать нахуй художников идея может и здравая, но если я могу сделать вещь удобной конечному пользователю - я буду делать её удобной. В Юнити в стандартном шейдере решили эту проблему этим самым заебатым редактором, и я хочу понять как они это сделали. Галки в шейдере - это в любом случае логика, а от логики шейдерным блокам больно. Выносил логику на внешние скрипты в особо тяжелых ситуациях, но всю логику выносить... Даже не знаю, насколько это оправдано. Интересно мнение работающего с этими вещами анона.
И да, всю инфу, которая соберётся в этом треде, оформлю в шапку к следующему треду. Очевидно, данный вопрос интересует не только меня.
>>169775 >В Юнити в стандартном шейдере решили эту проблему этим самым заебатым редактором, и я хочу понять как они это сделали. Галки в шейдере - это в любом случае логика
По-моему, логика редактора никак не влияет на логику шейдеров. Все равно все что мы пишем на cg компилируется в некий computed code. По сути редактор создает кучу шейдеров с разными комбинациями этих самых галочек, выпадающих списков и прочего. А затем при рендере подставляет нужный уже скомпилированный шейдер.
Во всяуос случае из того что я читал - сделал такие выводы. Может не так что-то понял конечно. Реквестируется знающий анон.
>>169767 Шэйдер-гуру в треде >Сильно ли больно фреймрейту от if\else и прочей логики? Зависит от ситуации, в большинстве случаев больно, на мобилах очень больно.
>К шейдерам вообще применимы паттерны? Наркоман сука штоле? hlsl/glsl языки структурные.
>при компиляции в билд всё неиспользуемое говно просто не компилируется в конечный билд. Могу ли я стандартными средствами unity сделать то же самое? Можешь :3
>>169950 Да вот не имел дела с такими языками, разрыв шаблона получил. Выглядит оно как-то жутко внутри, понятно, вроде даже и просто, но жутко. За наводку спасибо, погуглю.
>>170022 О, кажется понимаю. Они препроцессор прямо в шейдер запихнули? Охуеть. Конечно препроцессору делать нечего в гуе, но я и не думал, что можно его прямо в шейдер запихнуть, лол.
>>170098 Слышал конечно, даже писал на Паскале, как-раз таки в школе. И...я просто переставал понимать тот код, который я пишу, когда программа разрасталась хотя-бы немного. Преподаватель был чудесный, но он не любил Паскаль всей душой, соответственно и учил ему не очень охотно. А учиться самому было ОЧЕНЬ лень, ибо было ощущение, что я работаю не с магией, а с кучей проводов и переключателей. По этой причине не упоминаю, что имел опыт на Паскале, равно как и сознательный опыт работы со структурными языками. Это не кодинг был вовсе, это было какое-то говно.
К слову, писал, помимо прочего, ещё и на Scheme, но уже после окончания школы. Понравился значительно больше, и, честное слово, лучше бы учили его.
>>170098 > Можно полностью кастом эдитор сделать, а можно через MaterialPropertyDrawer > http://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html Спасибо за инфу об этой штуке. Но тут вот какой момент - у меня шейдер сделан универсальным, лепи из него что душе угодно, но я использовал для этого if/else. т.е. есть булевая переменная *мерцание неонового хуя" стоит в true, то в цикле if выбирается ветка с алгоритмом мерцания. Но куда не загляну - везде по пальцам бьют за такое. Нашел два метода, один описан выше и реализован в стандартном шейдере, а именно компиляция кучи .cginc под каждую функцию и их подключение в самом шейдере при нажатии кнопки. Второй вариант - использовать Lerp вместо If'a. Подсказали на каком-то английском форуме, сам пока не пробовал, но выглядит очень годным методом, разве что не слишком удобным.
>>170203 "Ну и кто теперь неправ, категоричная сучечка? " По твоему компилятор шейдеров настолько умный, что автоматически проводит препроцессинг кода на CG? Не видел этому доказательств. В исходниках стандартного шейдера препроцессор написан руками.
>Лерп неудобно. Охуеть. В качестве логического элемента непривычно. Плюс я плохо себе представляю, как на лерпе можно сделать ветвление вида if(ophui){ if(optochnohui?){ }} (макака сожрала разметку кода, так что терпи).
>>170205 Еще раз. Условные переходы редактора на превращаются в условныепереходы в скопмлированном шейдере.
>как на лерпе можно сделать ветвление вида Это синтетический пример. Как правило все привязано к какому-то флотату, и нужно выбрать из двух вариантов результата
possatNaOpa = lerp(possatNaOpa, viebatMamkuOpa, opHui); Уоу. Ценная инфа, весьма благодарен. Я тут шоколад ем, с тобой бы поделился, но монитор потом чистить, так что обойдешься устной благодарностью.
>Условные переходы редактора на превращаются в условныепереходы в скопмлированном шейдере. т.е. я могу класть хуй и использовать в шейдерлабе логику? А это сработает, если я буду ей пользоваться прямо в CGPROGRAM?
>>170210 Ты понимаешь, что то, что ты написал в файле .shader - не сам шейдер? Он еще должен скомпилироваться. Заметь, когда выбираешь свой шейдер в инспекторе - там есть кнопка "Compile and show code". В нем простыня кода шейдеров под разные платформы, типы рендеринга и прочей херни.
Так вот все что ты написал в CGPROGRAM - это все туда попадает, со всей логикой и прочей хуетой.
А юнитехи, запили логику, компиляции шейдера в по сути в редактор материала. И перенесли туда галочки, списки и т.д. То есть выбрал ты из списка "rendering mofe - opaque" - он компилирует шейдер без блока обработки прозрачности. Выбрал "cutout" - на тебе блок кода по отсечению пикселей.
И так далее. И получается что в итоге, в финальном шейдере нет никаких if/else.
>>170213 Ах да, ещё такой момент. Я всю логику, которую мог, выносил на внешние .cs скрипты. В частности анимацию прокручивания UV координат, всякие тайминги и всё в этом роде. Но после твоего сообщения меня посетила мысль... А что если внести логику в сам шейдер, но за рамки CGPROGRAM? Прокрутку UV то точно можно, а вот как быть, скажем, если мне нужно растворить материал по маске по команде внешнего скрипта? Я для этого делал внешний скрипт-контроллер, а уже его связывал с шейдером глобальными переменными (не знаю другого способа, делал это при помощи метода Shader.SetGlobal)
И последний, на данный момент, вопрос. Как шейдерлаб к VS прикрутить? На данный момент использую Notepad++ в качестве редактора, синтаксис для него, опять же, взял на одном из форумов. Но не хватает Intellisense :c
>>170218 <всю логику, которую мог, выносил на внешние .cs скрипты. В частности
Я думаю все переносить в шейдер тоже не дело. Нахер максимализм, исходить нужно из логики удобства и наглядности. Например ювишки я кручу скриптом. Хття бы потому-что в шейдере нет параметра deltaTime. И если уж все равно его нужно передавать в шейдер, мне проще сразу посчитать смещение uv в скрипте и уже его слать.
>Как шейдерлаб к VS прикрутить? Я не нашел способа это сделать, сам страдаю.
Пикрилейтед - мой способ заставить работать Realtime Emissive. На материале - источнике весит эмиссив, который, помимо прочего, меняет свой цвет по таймингу. Чтобы вслед за ним менялось и освещение ближайших предметов я вешаю на предметы этот скрипт. Всё работает, но волнует вопрос оптимизации, ведь не просто же так в эмиссиве по-умолчанию реалтайм отключен.
>>170210 >т.е. я могу класть хуй и использовать в шейдерлабе логику? А это сработает, если я буду ей пользоваться прямо в CGPROGRAM? Вообщем тут такой стул - если у тебя есть статическая булевая переменная, то компилятор достаточно умный чтоб скомпилить две версии шэйдера. Так например сделано в анриле4. Но в юнити ты не можешь сделать булевую пропертю/юниформ, тебе придётся делать в стиле if(op_hui >= 0.5) o.Albedo += mamu_ebal(); это компилятор не заоптимизирует. По мне так оптимальней всего делать через дефайны и мультикомпиляцию шэйдеров, так весь стандартный шэйдер в пятёрке сделан. http://docs.unity3d.com/460/Documentation/Manual/SL-CustomMaterialEditors.html http://docs.unity3d.com/460/Documentation/Manual/SL-MultipleProgramVariants.html
>>170226 >Например ювишки я кручу скриптом. Хття бы потому-что в шейдере нет параметра deltaTime. Не пизди, есть [code] uniform vec4 _Time; uniform vec4 _SinTime; uniform vec4 _CosTime; [/code] Иногда удобнее скроллить UV в шэйдере т.к. когда ты меняешь Scale/Offset из скрипта то создаётся копия материала, и дровколлы могут улететь в небеса(например когда рисуешь анимированый прибой).
>>169767 Раз уж речь зашла о шейдерах, есть ли какое-нибудь бесплатное стэнд-элоун приложение, в котором можно было бы писать шейдеры для обработки изображений?
>>170351 Я фотошопом ни разу не пользовался, так что не ебу. Я знаю, что был раньше pixel bender, в котором можно было в том числе писать шейдеры для флэша, фотошопа и афтер эффектс, но он теперь дохлый, да и изначально был фичами небогат.
>>170386 Нахуя ты тогда на изображениях сделал акцент? Сказал бы сразу, что тебе редактор шейдеров нужен. Дохуя их, есть RenderMonkey, есть аналогичное по функционалу и степени тухлости решение от нвидии, которое сто лет не обновляли. Однако они выкатили какую-то йобу в 2013 вроде, название не помню, надо рыскать по закладкам, но штука очень мощная. Настолько, что для полнофункциональной работы требует, мать его, вторую видеокарту под вывод окна рендеринга. Там же и встроенный мощный профайлер и куча всякой другой годноты.
Поясните по хардкору за такой эффект, как аутлайн. Я знаю пока что один метод: Сделать два прохода в шейдоре, в одном шейдоре малевать обычный объект, а во втором увеличенный, при этом нужно еще как-то сделать, чтобы обычный объект малевался над увеличенным. Как сделать очередность малевания - я не знаю, но предпологаю, что очень просто, лол. Как еще можно заебенить аутлайн?
Запилил несколько няшных шейдеров в ShaderForge, люто доставило, но, по личным ощущением, оно годится только для прототипирования, и после обкатки прототипа в связке с остальной игровой инфраструктурой необходимо переписывать уже руками. Слюни капают на UE4 и UDK с тамошним редактором шейдеров, но в силу обстоятельств вынужден использовать юнити, что, впрочем, не так уж и плохо.
Помимо всего прочего, реквестирую советы шейдерокодеров по оптимизации. Сильно ли больно фреймрейту от if\else и прочей логики? Художники люто требуют максимальную унификацию, решение "Всё в одном" вместо десятка по-разному настроенных шейдеров. Это ли праведный путь, или стоит знать меру? К шейдерам вообще применимы паттерны? (глупый вопрос, наверное, но кодингом занимаюсь всего год и первым языком был C#, со всеми вытекающими. От структуры выдаваемого шейдерфорджем кода хочется плакать).
И последний вопрос - наткнулся на описание стандартного шейдера в 5 юньке, и согласно ему при компиляции в билд всё неиспользуемое говно просто не компилируется в конечный билд. Могу ли я стандартными средствами unity сделать то же самое?