Добавить проход шейдера в пользовательском шейдере
Pass — базовый элемент объекта Shader. Он содержит инструкции для задания состояния GPU, а также шейдерные программы, выполняемые на GPU.
Простые объекты Shader могут содержать всего один Pass, а более сложные — несколько. Отдельные Pass позволяют описывать части объекта Shader, которые работают по-разному: например, части, которым нужно другое состояние рендеринга, другие шейдерные программы или другой тег Pass LightMode.
Примечание: в конвейере рендеринга на базе Scriptable Render Pipeline изменить состояние рендеринга на GPU можно через RenderStateBlock, не создавая отдельный проход.
Чтобы определить обычный Проход в ShaderLab, вы помещаете блок Pass внутрь блока SubShader.
Вы также можете определить два специальных типа Пропуска, используя команды UsePass или GrabPass. Информацию об этих командах см. в разделе ShaderLab команды: UsePass или ShaderLab команды: GrabPass.
Название прохода шейдера
Пас может иметь имя. Вы должны ссылаться на Пас по имени в команде UsePass, и в некоторых C# APIs. Имя Паса видно в инструменте Frame Debugger.
Чтобы назначить имя Проходу в ShaderLab, вы помещаете блок Name внутрь блока Pass.
Внутренне, Unity преобразует имя в заглавные буквы. Когда вы ссылаетесь на имя в коде ShaderLab, вы должны использовать вариант с заглавными буквами; например, если значение "пример", вы должны ссылаться на него как на EXAMPLE.
Если более одного Пропуска в одном и том же SubShader имеет одно и то же имя, Unity использует первый Пропуск в коде.
Использование имени пароля со скриптами C#
Чтобы получить доступ к имени Пропуска из скриптов C#, вы можете использовать APIs, например Material.FindPass, Material.GetPassName, или ShaderData.Pass.Name.
Примечание: Material.GetShaderPassEnabled и Material.SetShaderPassEnabled не ссылаются на пропуска по имени; вместо этого они ссылаются на пропуска по значению тега LightMode.
Пример
Этот пример кода демонстрирует синтаксис создания объекта Shader, содержащего один SubShader, который в свою очередь содержит один Pass.
Shader "Examples/SinglePass"
{
SubShader
{
Pass
{
Name "ExamplePassName"
Tags { "ExampleTagKey" = "ExampleTagValue" }
// ShaderLab commands go here.
// HLSL code goes here.
}
}
}