Заменить шейдеры во время выполнения во Встроенном Render Pipeline
В Built-in Render Pipeline вы можете сказать Camera изменить шейдер, который он использует для отображения определенной геометрии во время выполнения. Вы можете сделать это для достижения визуального эффекта, такого как обнаружение кромок.
Замена шейдеров осуществляется из скриптов с помощью либо Camera.RenderWithShader или Camera.SetReplacementShader обе функции принимают шейдер и a replacementTag.
Это работает следующим образом: камера рендирует сцену как обычно. Объекты по-прежнему используют свои материалы, но используемый ими шейдер меняется:
- Если replacementTag пуст (должна быть пустой строкой, а не нулем), то все объекты в сцене отображаются с указанным замещающим шейдером.
- Если replacementTag не является пустым, то для каждого объекта, который будет отображаться:
- Для получения значение тега.
- Если у него нет этого метки, объект не отображается как.
- A субшадер обнаружено в заменяющем шейдере, имеющем заданный тег с найденным значением. Если такой субшайдер не найден, объект не представлены.
- Теперь этот subshader используется для рендеринга объекта.
Так что если бы все шейдеры имели, например, “RenderType» тегов со значениями, такими как “Непрозрачный”, “Прозрачный”, “Фон”, “Оверлей”, вы можете написать замену шейдер, который только рендеринг твёрдых объектов, используя один subshader с RenderType= твердое вещество метка. Другие типы тегов не будут найдены в замещающем шейдере, поэтому объекты не будут отображаться. Или вы можете написать несколько субшайдеров для разных “RenderType” значения тегов. Кстати, все встроенные Shader объекты имеют “RenderType« Набор тегов.
Замена освещённого шейдера
При использовании замены шейдера сцена рендируется с использованием пути рендеринга, настроенного на камере. Это означает, что используемый для замены шейдер может содержать тени и освещение (для замены шейдера можно использовать поверхностные шейдеры). Это может быть полезно для рендеринга специальных эффектов и отладки сцены.
Метки замены шейдеров во встроенных шейдерах
Все встроенные шейдеры имеют набор тегов “RenderType” которые могут быть использованы при рендеринге с замененными шейдерами. Значения тегов следующие:
- Непрозрачный: большинство шейдеров (Нормальная, Самоосвещение, Светоотражающие, ландшафтные шейдеры).
- прозрачный: большинство полупрозрачных шейдеров (прозрачный, Particle, Font, terrain additive pass shaders).
- TransparentCutout: замаскированные прозрачные шейдеры (прозрачная вырезка, двухпроходные растительные шейдеры).
- Фон: Skybox шейдеры.
- Оверлей: Halo, Флаерные шейдеры.
- TreeOpaque: корень дерева для двигателя.
- TreeTransparentCutout: листья деревьев для внедорожников.
- TreeBillboard: двигатель повышенной проходимости с деревьями.
- Трава: трава двигателя местности.
- GrassBillboard: двигатель местности билбордов трава.
Встроенная текстура глубины сцены/нормал
Camera имеет встроенную возможность рендеринга текстуры глубины или глубины + нормальных значений, если вам это нужно в некоторых из ваших эффектов. См. страницу Camera Depth Texture. Обратите внимание, что в некоторых случаях (в зависимости от оборудования), текстуры глубины и глубины + нормальных значений могут быть внутренне рендеринг с помощью замены шейдера. Поэтому важно иметь правильный “RenderType” тег в ваши шейдеры.
Пример кода
Ваша функция Start() указывает заменяющие шейдеры:
void Start() {
camera.SetReplacementShader (EffectShader, "RenderType");
}
Это требует, чтобы EffectShader использовал ключ RenderType. EffectShader будет иметь теги ключ-значение для каждого RenderType, который вы хотите. Shader будет выглядеть примерно так:
Shader "EffectShader" {
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
...
}
}
SubShader {
Tags { "RenderType"="SomethingElse" }
Pass {
...
}
}
...
}
SetReplacementShader будет просматривать все объекты в сцене и, вместо использования их обычного шейдера, использовать первый субшайдер, который имеет соответствующее значение для указанного ключа. В этом примере, любые объекты, у которых в шейдере есть тег Rendertype=“Opaque” будут заменены первым субшайдером в EffectShader, любые объекты с шейдером RenderType=“SomethingElse” будут использовать второй заменяющий субшайдер и так далее. Любые объекты, у которых в шейдере нет соответствующего значения для указанного ключа в заменяющем шейдере, не будут отображаться.