Пытаюсь разобраться с replacement shader на камере.
Кто-нибудь в курсе как это работает? Так и не разобрался. Буду очень рад простому примеру.
waruiyume писал(а):Страницу справки починили http://docs.unity3d.com/Manual/SL-Shade ... ement.html (собственно ничего не добавишь).
В прошлый раз когда я тута заходил там было пусто.
Очень наглядный демо проект юнитеков https://www.assetstore.unity3d.com/en/#!/content/5145(искать его пришлось с собаками, комментах пишут, что он не 100% рабочий, но думаю, что копипастить из него можно и сейчас.)
Ещё один пример, в нём с помощью Replecement shader создаётся маска для объектов, в шейдере которых указан определённый тег.
waruiyume писал(а):Дык, там же ниже есть пример.
Допустим, у Вас на сцене есть объекты с "RenderType"="Opaque" и "RenderType"="blabla"
При отрисовке с заменой, сабшейдеры объектов на сцене "заменяются" сабшейдерами из шейдера который передаётся в первом параметре. Во втором параметре, фактически, указывается переменная, которая должна совпасть в сабшейдере на сцене и сабшейдере эффекта.Синтаксис:Используется glslShader "EffectShader" {
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
//рисовать с красной заливкой
}
}
SubShader {
Tags { "RenderType"="blabla" }
Pass {
//рисовать кислотный трип
}
}
...
}
Получится ли у меня с заменой шейдера игнорить отрисовку, если я пропишу аддитивный шейдер с 0 альфой?
waruiyume писал(а):Получится ли у меня с заменой шейдера игнорить отрисовку, если я пропишу аддитивный шейдер с 0 альфой?
Нет, такое сделать не получится, поскольку, будут отрисованы только заменённые, т.е. Вам придётся дублировать все используемые шейдеры, что, явно, крайне затруднительно.
В смысле, нельзя создавать рантайм, всегда же есть 32 слоя, и ни больше ни меньше сделать слоёв не получится?
Может просто задефайнить в шейдере участок который будет делать discard или возвращать цвет с нулевой альфой, и включать ключевое слово при надобности?
А вообще, не проще вырубить рендерер?
Слои кстати можно создавать только в редакторе
waruiyume писал(а):Слои кстати можно создавать только в редакторе
Слои нельзя создавать в принципе, ни в редакторе, ни в рантайме, можно только назначить им имя. Если у слоя не имени это не значит, что слой не существует.
Ну, так не используйте GrabPass, разве нельзя отрендерить с цену в OnPrerender в текстуру, предварительно выключив ненужные рендереры?
Можно ли такое провернуть стенсил буфером:?
waruiyume писал(а):Так:Синтаксис:
- void OnPreRender ()//Вызывается только для камеры
- {
- ВыключитьТоЧтоНеНужно();
- ОтрендеритьКамеруВтекстуру();
- ВключитьНенужноеОбратно();
- }
В этом случае фокус в дефайнами должен сработать, GrabPass же не будет использоваться.Можно ли такое провернуть стенсил буфером:?
По идеи можно, нужно в самом начале нарисовать прямоугольник на весь экран, который бы изменял значение буфера. Правда, я не уверен, что на всех платформах это будет работать одинаково.
Replacement шейдер всё равно игнорирует значения ключей.
waruiyume писал(а):Найдите все рендереры Object.FindObjectsOfType, а потом отсейте по шейдеру из используемых материалов.Replacement шейдер всё равно игнорирует значения ключей.
Вы чего-то путаете.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6