Каждый шейдер в Unity состоит из списка subshader’ов. Когда Unity должен отобразить меш, он ищет шейдер для использования и выбирает первый subshader, который работает на видеокарте пользователя.
Subshader { [Tags] [CommonState] Passdef [Passdef ...] }
Определяет subshader в виде опциональных тэгов, общего состояния и списка определений проходов.
Subshader определяет список проходов рендеринга и опционально устанавливает любое общее для всех проходов состояние. Кроме того, могут быть установлены специфичные для subshader тэги.
Когда Unity выбирает, с помощью какого subshader’а рендерить, он рендерит объект один раз для каждого определенного прохода (и, возможно, более одного раза из-за взаимодействия с освещением). Поскольку каждая операция рендера объекта требует немалых затрат, вы желаете определять шейдер с минимальным количеством возможных проходов. Конечно, иногда на некотором графическом оборудовании необходимый эффект не может быть достигнут за один проход; тогда у вас не остаётся выбора, кроме как использовать несколько проходов.
В качестве определения каждого прохода может быть обычный Pass, UsePass или GrabPass.
Любые выражения, которые разрешены в определении Pass, могут также использоваться в блоке Subshader. Это заставит все проходы использовать это “общее” состояние.
// ...
SubShader {
Pass {
Lighting Off
SetTexture [_MainTex] {}
}
}
// ...
Этот subshader определяет один проход, который выключает любое освещение и просто отображает меш с текстурой под названием _MainTex.