Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

ShaderLab: назначение тегов для SubShader

Эта страница содержит информацию об использовании блока Теги в вашей ShaderLab Язык Unity для определения структуры объектов Shader. Подробнее
См. код Словарь
для назначения тегов субшейдеру.

Информацию об определении вложенного шейдера см. в разделе ShaderLab: определение вложенного шейдера. Для получения информации о том, как Shaderпрограмма работает на GPU. Подробнее
См. в Словарь
работы объектов и отношения между объектами шейдеров, субшейдерами и проходами. , см. раздел Объекты шейдеров.

Обзор

Теги представляют собой пары данных "ключ-значение". Unity использует предопределенные ключи и значения, чтобы определить, как и когда использовать данный SubShader, или вы также можете создавать свои собственные теги SubShader с пользовательскими значениями. Вы можете получить доступ к тегам SubShader из кода C#.

Совместимость конвейера рендеринга

Название функции Встроенный конвейер рендеринга Универсальный конвейер рендеринга (URP) Конвейер рендеринга высокого разрешения (HDRP) Пользовательская SRP
ShaderLab: SubShader Tags block Да Да Да Да
ShaderLab: RenderPipeline SubShader tag Нет Да Да Нет
ShaderLab: Queue SubShader tag Нет Да Yes

Yes

Примечание. в пользовательском SRP вы можете определить свой собственный порядок рендеринга и выбрать, использовать ли очереди рендеринга. Дополнительные сведения см. в разделах DrawingSettings и SortingCriteria.

ShaderLab: RenderType SubShader tag Да Да Да Да
ShaderLab: DisableBatching SubShader tag Да Да Да Да
ShaderLab: ForceNoShadowCasting SubShader tag Да Да Yes

This disables regular shadows, but has no effect on contact shadows.

Да
ShaderLab: CanUseSpriteAtlas SubShader tag Да Да Да Да
ShaderLab: PreviewType SubShader tag Да Да Да Да

Использование блока тегов в подшейдере

В ShaderLab вы назначаете теги вспомогательному шейдеру, помещая блок Tags внутрь блока SubShader.

Обратите внимание, что и вложенные шейдеры, и проходы используют блок Теги, но работают по-разному. Назначение тегов SubShader для прохода не имеет никакого эффекта, и наоборот. Разница в том, где вы размещаете блок Теги:

  • Чтобы определить теги Pass, поместите блок Tags внутрь блока Pass.
  • Чтобы определить теги SubShader, поместите блок Tags внутрь блока SubShader, но вне Пропустить блок.

Информацию о присвоении тегов пропуску см. в разделе Назначение тегов пропуску.

Подпись Функции
Tags { “[name1]” = “[value1]” “[name2]” = “[value2]”} Применяет указанные теги к SubShader.

Вы можете определить любое количество тегов.

Использование тегов SubShader с кодом C#

Теги SubShader можно прочитать из скрипта C# с помощью Material.GetTag API, например:

using UnityEngine; public class Example : MonoBehaviour { // Attach this to a gameObject that has a Renderer component string tagName = "ExampleTagName"; void Start() { Renderer myRenderer = GetComponent(); string tagValue = myRenderer.material.GetTag(ExampleTagName, true, "Tag not found"); Debug.Log(tagValue); } }

Тег RenderPipeline

Тег RenderPipeline сообщает Unity, совместим ли субшейдер с универсальным конвейером рендеринга (URP) или конвейером рендеринга высокого разрешения (HDRP).

Синтаксис и допустимые значения

Подпись Функции
“RenderPipeline” = “[name]” Сообщает Unity, совместим ли этот SubShader с URP или HDRP.
Параметры Значение Функции
[name] UniversalRenderPipeline Этот SubShader совместим только с URP.
HighDefinitionRenderPipeline Этот SubShader совместим только с HDRP.
(any other value, or not declared) Этот SubShader не совместим с URP или HDRP.

Примеры

В этом примере кода объявляется, что SubShader совместим с URP:

Shader "ExampleShader" { SubShader { Tags { "RenderPipeline" = "UniversalRenderPipeline" } Pass { … } } }

Тег очереди

Тег Queue сообщает Unity, какую очередь рендеринга использовать для рендеринга геометрии. Очередь рендеринга — это один из факторов, определяющих порядок, в котором Unity рендерит геометрию.

Синтаксис и допустимые значения

Тег Queue можно использовать двумя способами: вы можете указать Unity использовать именованную очередь рендеринга или безымянную очередь рендеринга, которая отображается после именованной очереди рендеринга.

Подпись Функции
“Queue” = “[queue name]” Используйте именованную очередь рендеринга.
“Queue” = “[queue name] + [offset]” Использовать безымянную очередь с заданным смещением от именованной очереди.

Примером, когда это полезно, является прозрачная вода, которую следует рисовать после непрозрачных объектов, но перед прозрачными объектами.

Подпись Значение Функции
[queue name] Background Определяет очередь фонового рендеринга.
Geometry Определяет очередь рендеринга геометрии.
AlphaTest Определяет очередь рендеринга AlphaTest.
Transparent Задает прозрачную очередь рендеринга.
Overlay Определяет очередь рендеринга наложения.
[offset] integer Указывает индекс, по которому Unity отображает безымянную очередь относительно именованной очереди.

Использование этого тега с кодом C#

Вы можете использовать Shader.renderQueue для чтения значения тега Queue активного подшейдера объекта Shader.

По умолчанию Unity рендерит геометрию в очереди рендеринга, указанной в теге [Queue]. Вы можете переопределить это значение для каждого материала. В редакторе Unity это можно сделать в инспекторе материалов, задав свойство Очередь рендеринга. В сценарии C# это можно сделать, установив значение Material.renderQueue с помощью файла Rendering.RenderQueue перечисление.

Примеры

В этом примере кода создается вспомогательный шейдер, который визуализирует геометрию как часть очереди прозрачного рендеринга:

Shader "ExampleShader" { SubShader { Tags { "Queue" = "Transparent" } Pass { … } } }

В этом примере кода создается SubShader, который визуализирует геометрию в безымянной очереди после очереди Geometry.

Shader "ExampleShader" { SubShader { Tags { "Queue" = "Geometry+1" } Pass { … } } }

Тег RenderType

Используйте тег RenderType, чтобы переопределить поведение объекта Shader.

Во встроенном конвейере рендеринга вы можете менять местами подшейдеры во время выполнения, используя технику, называемую заменой шейдера. Этот метод работает путем идентификации подшейдеров, которые имеют совпадающие значения тега RenderType. В некоторых случаях это используется для создания текстуры глубины камеры.

В конвейере рендеринга на основе Scriptable Render Pipeline можно переопределить состояние рендеринга, определенное в объекте Shader, с помощью структуры RenderStateBlock. Вы можете использовать значение тега RenderType, чтобы определить субшейдеры для переопределения.

Синтаксис и допустимые значения

Подпись Функции
“RenderType” = “[renderType]” Установите значение RenderType для этого SubShader.
Подпись Значение Функции
[renderType] String Для этого параметра нет заданных значений. Чтобы определить значение RenderType для любого вспомогательного шейдера, который вы хотите заменить, откройте исходный файл шейдера.

Теги RenderType SubShader для устаревших встроенных шейдеров Unity перечислены на странице замены шейдеров.. р>

Вы также можете создавать собственные значения для пользовательских подшейдеров.

Использование этого тега с кодом C#

Информацию о замене шейдеров во встроенном конвейере рендеринга см. в разделе Замена шейдеров. Для получения информации об использовании RenderStateBlock в Scriptable Render Pipeline см. документацию по API для ScriptableRenderContext.DrawRenderers.

Примеры

В этом примере кода создается SubShader со значением RenderType TransparentCutout:

Shader "ExampleShader" { SubShader { Tags { "RenderType" = "TransparentCutout" } Pass { … } } }

Тег ForceNoShadowCasting

Тег ForceNoShadowCasting не позволяет геометрии в SubShader отбрасывать (а иногда и получать) тени. Точное поведение зависит от конвейера рендеринга и рендерингапроцесса вывода графики на экран (или текстуры рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в пути Словарь
.

Это может быть полезно, если вы используете замену шейдера, но не хотите наследовать передачу тени от другого вспомогательного шейдера.

Синтаксис и допустимые значения

Подпись Функции
“ForceNoShadowCasting” = “[state]” Следует ли предотвращать отбрасывание (а иногда и получение) теней для всей геометрии, использующей этот SubShader.
Подпись Значение Функции
[state] True Unity не позволяет геометрии в этом SubShader отбрасывать тени.

В встроенном конвейере рендеринга с путями рендеринга Forward, Legacy Vertex Lit или Legacy Deferred Unity также предотвращает получение теней геометрией в этом SubShader.

В HDRP это не мешает геометрии отбрасывать контактные тени.

False Unity не препятствует тому, чтобы геометрия в этом SubShader отбрасывала или получала тени. Это значение по умолчанию.

Примеры

В этом примере кода создается SubShader со значением ForceNoShadowCasting True:

Shader "ExampleShader" { SubShader { Tags { "ForceNoShadowCasting" = "True" } Pass { … } } }

Тег DisableBatching

Тег субшейдера DisableBatching запрещает Unity применять динамическую пакетную обработку Автоматический процесс Unity, который пытается визуализировать несколько сеток, как если бы они были одной сеткой, для оптимизации графической производительности. Этот метод преобразует все вершины GameObject на ЦП и группирует множество похожих вершин вместе. Подробнее
См. в Словаре
геометрию, использующую этот SubShader.

Это полезно для шейдерных программ, выполняющих операции с объектным пространством. Динамическая пакетная обработка преобразует всю геометрию в мировое пространство, а это означает, что шейдерные программы больше не могут обращаться к объектному пространству. Следовательно, шейдерные программы, которые полагаются на пространство объектов, не отображают правильно. Чтобы избежать этой проблемы, используйте этот тег SubShader, чтобы Unity не применяла динамическую пакетную обработку.

Синтаксис и допустимые значения

Подпись Функции
“DisableBatching” = “[state]” Предотвращает ли Unity динамическую пакетную обработку для всей геометрии, использующей этот субшейдер.
Подпись Значение Функции
[state] True Unity запрещает динамическую пакетную обработку для геометрии, использующей этот субшейдер.
False Unity не препятствует динамической пакетной обработке геометрии, использующей этот субшейдер. Это значение по умолчанию.
LODFading Unity предотвращает динамическую пакетную обработку для всей геометрии, которая является частью LODGroup со значением Fade Mode, отличным от None. В противном случае Unity не препятствует динамической пакетной обработке.

Примеры

В этом примере кода создается SubShader со значением DisableBatching True:

Shader "ExampleShader" { SubShader { Tags { "DisableBatching" = "True" } Pass { … } } }

Игнорировать тег Projector

Во встроенном конвейере рендеринга тег IgnoreProjector SubShader сообщает Unity, влияют ли на геометрию проекторы. Это в основном полезно для исключения полупрозрачной геометрии, с которой проекторы несовместимы.

Этот тег не действует в других конвейерах рендеринга.

Синтаксис и допустимые значения

Подпись Функции
“IgnoreProjector” = “[state]” Игнорирует ли Unity проекторы при рендеринге этой геометрии.
Подпись Значение Функции
[state] True Unity игнорирует проекторы при рендеринге этой геометрии.
False Unity не игнорирует проекторы при рендеринге этой геометрии. Это значение по умолчанию.

Примеры

В этом примере кода создается SubShader со значением IgnoreProjectors True:

Shader "ExampleShader" { SubShader { Tags { "IgnoreProjector" = "True" } Pass { … } } }

Тег PreviewType

Тег PreviewType SubShader сообщает редактору Unity, как отображать материал, который использует этот SubShader, в Инспекторе материаловОкно Unity, в котором отображается информация о выбранном в данный момент игровом объекте, активе или настройках проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
См. в Словарь
.

Синтаксис и допустимые значения

Подпись Функции
“PreviewType” = “[shape]” Какую форму использует редактор Unity для предварительного просмотра материала, в котором используется этот субшейдер.
Подпись Значение Функции
[shape] Sphere Отобразите материал на сфере. Это значение по умолчанию.
Plane Отображение материала на плоскости.
SkyboxОсобый тип материала, используемый для изображения неба. Обычно шестигранник. More info
See in Словарь
Отобразите материал на скайбоксе.

Примеры

В этом примере кода создается SubShader со значением PreviewType Plane:

Shader "ExampleShader" { SubShader { Tags { "PreviewType" = "Plane" } Pass { … } } }

Тег CanUseSpriteAtlas

Используйте этот тег SubShader в проектах, в которых используется устаревший упаковщик спрайтов, чтобы предупредить пользователей о том, что ваш шейдер основан на исходных координатах текстуры и поэтому им не следует упаковывать его текстуры в атласы. .

Синтаксис и допустимые значения

Подпись Функции
“CanUseSpriteAtlas” = “[state]” Совместимы ли спрайты, использующие этот вспомогательный шейдер, с устаревшими SpriteA двухмерными графическими объектами. Если вы привыкли работать в 3D, спрайты — это, по сути, просто стандартные текстуры, но есть специальные приемы комбинирования текстур спрайтов и управления ими для повышения эффективности и удобства во время разработки. Подробнее
См. в Словарь
Packer.
Подпись Значение Функции
[state] True Спрайты, использующие этот SubShader, совместимы с устаревшим Sprite Packerсредством, которое плотно упаковывает графику из нескольких текстур спрайтов в одну текстуру. известен как атлас. Unity предоставляет утилиту Sprite Packer для автоматизации процесса создания атласов из отдельных текстур спрайтов. Подробнее
См. в Словарь
. Это значение по умолчанию.
False Спрайты, использующие этот SubShader, несовместимы с Legacy Sprite Packer.

Когда SubShader со значением CanUseSpriteAtlas, равным False, используется со спрайтом, который имеет тег упаковки Legacy Sprite Packer, Unity показывает сообщение об ошибке в Инспекторе.

Примеры кода тега CanUseSpriteAtlas

В этом примере кода создается SubShader со значением CanUseSpriteAtlas False:

Shader "ExampleShader" { SubShader { Tags { "CanUseSpriteAtlas" = "False" } Pass { … } } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3