Эта страница содержит информацию об использовании блока Properties
в вашей ShaderLab Язык Unity для определения структуры объектов Shader. Подробнее
См. в коде Словарь, чтобы определить свойства материала для ШейдерПрограмма, работающая на графическом процессоре. Подробнее
См. в объекте Словарь.
Обзор
В коде ShaderLab вы можете определить свойства материала. Материальное свойство — это свойство, которое Unity хранит как часть материального актива. Это позволяет художникам создавать, редактировать и делиться материалами с различными конфигурациями.
Если вы используете свойства материала:
- Вы можете получить или установить значение переменной в объекте Shader, вызвав функции для материала (например, Material.SetFloat).
- Вы можете просматривать и редактировать значения с помощью материала Inspectorокна Unity, в котором отображается информация о выбранном в данный момент игровом объекте, активе или настройки проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
См. в Словарь. - Unity сохраняет внесенные вами изменения как часть материального актива, поэтому они сохраняются между сеансами.
Если вы не используете свойства материала:
* Вы по-прежнему можете получить или установить значение переменной в объекте Shader, вызвав функцию для материала.
* Для этих значений нет визуального редактора.
* Изменения не сохраняются между сеансами.
Единственный случай, когда вы обычно не создаете свойство материала, — это если вы хотите установить значения свойств шейдера полностью с помощью скриптовКусок кода, который позволяет вам создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на пользовательский ввод любым удобным для вас способом. Подробнее
См. в Словарь (например, если вы создаете процедурный контент), если свойства нельзя преобразовать в свойства материала, или если вы не хотите, чтобы они редактировались в Инспекторе.
Совместимость конвейера рендеринга
Название функции | Встроенный конвейер рендеринга | Универсальный конвейер рендеринга (URP) | Конвейер рендеринга высокого разрешения (HDRP) | Пользовательская SRP |
---|---|---|---|---|
ShaderLab: Properties block | Да | Yes В вашем коде HLSL вы должны поместить переменные для каждого материала в один и тот же CBUFFER для совместимости с SRP Batcher. |
Yes В вашем коде HLSL вы должны поместить переменные для каждого материала в один и тот же CBUFFER для совместимости с SRP Batcher. |
Yes В вашем коде HLSL вы должны поместить переменные для каждого материала в один и тот же CBUFFER для совместимости с SRP Batcher. |
Использование блока свойств
Чтобы назначить свойства материала объекту Shader в ShaderLab, вы помещаете блок Properties
внутрь блока Shader
.
Подпись | Функции |
---|---|
Properties {
}
|
Сохраняет заданные свойства как часть материального актива и использует значения, хранящиеся в материальном активе, во время рендеринга. Блок Properties может содержать любое количество объявлений свойств материала. |
Декларации о материальной собственности
Все объявления свойств материалов имеют следующий базовый формат:
[optional: attribute] name("display text in Inspector", type name) = default value
Точный синтаксис зависит от типа.
Этот раздел содержит информацию о:
Синтаксис объявления свойства материала по типу
Имя типа и синтаксис значения по умолчанию зависят от типа свойства.
В коде шейдера принято начинать имена всех свойств с символа подчеркивания. Примеры на этой странице соответствуют этому соглашению.
Тип | Пример синтаксиса | Комментарий |
---|---|---|
Int | _ExampleName ("Int display name", Int) = 1 |
Примечание. Несмотря на название, этот тип на самом деле поддерживается числом с плавающей запятой. |
Float |
_ExampleName ("Float display name", Float) = 0.5
|
Максимальное и минимальное значения ползунка диапазона включаются. |
Texture2D |
_ExampleName ("Texture2D display name", 2D) = "" {}
|
Поместите следующие значения в строку значения по умолчанию, чтобы использовать одну из встроенных текстур Unity: «белый» (RGBA: 1,1,1,1), «черный» (RGBA: 0,0,0,1), «серый» (RGBA: 0,5,0,5,0,5,1), «выпуклый» (RGBA: 0,5,0,5,1,0,5) или «красный» (RGBA: 1,0,0,1).
Если вы оставите строку пустой или введете недопустимое значение, по умолчанию она будет «серой». Примечание. эти текстуры по умолчанию не отображаются в Инспекторе. |
Texture2DArray | _ExampleName ("Texture2DArray display name", 2DArray) = "" {} |
Дополнительные сведения см. в разделе массивы текстур. |
Texture3D | _ExampleName ("Texture3D", 3D) = "" {} |
Значение по умолчанию — «серая» (RGBA: 0,5,0,5,0,5,1) текстура. |
CubemapКоллекция из шести квадратных текстур, которые могут представлять отражения в окружающей среде или скайбокс, нарисованный позади вашей геометрии. Шесть квадратов образуют грани воображаемого куба, окружающего объект; каждая грань представляет вид по направлениям мировых осей (вверх, вниз, влево, вправо, вперед и назад). More info See in Словарь |
_ExampleName ("Cubemap", Cube) = "" {} |
Значение по умолчанию — «серая» (RGBA: 0,5,0,5,0,5,1) текстура.. |
CubemapArray | _ExampleName ("CubemapArray", CubeArray) = "" {} |
See Cubemap arrays. |
Color | _ExampleName("Example color", Color) = (.25, .5, .5, 1) |
Это сопоставляется с float4 в коде вашего шейдера.
Инспектор материалов отображает палитру цветов. Если вы предпочитаете редактировать значения как четыре отдельных числа с плавающей запятой, используйте тип Vector. |
Vector | _ExampleName ("Example vector", Vector) = (.25, .5, .5, 1) |
Это сопоставляется с float4 в коде вашего шейдера.
Инспектор материалов отображает четыре отдельных плавающих поля. Если вы предпочитаете редактировать значения с помощью палитры цветов, используйте тип «Цвет». |
Зарезервированные имена свойств материала
В Unity есть несколько зарезервированных имен для свойств материалов. Когда вы создаете свойство материала с одним из этих имен, Unity выполняет предопределенные операции. Не используйте эти имена, если вы не собираетесь использовать эту функцию.
Имя | Пример синтаксиса | Функции |
---|---|---|
_TransparencyLM | _TransparencyLM ("Transmissive Texture", 2D) = "white" {} |
Включает пользовательскую прозрачность RGB во время лайтмэппинга.
Дополнительную информацию см. в разделе Лайтмэппинг и шейдеры. |
Атрибуты свойств материала
Объявления свойств материалов могут иметь необязательный атрибут, который сообщает Unity, как с ними обращаться.
Помимо перечисленных здесь атрибутов, вы можете использовать тот же синтаксис для добавления MaterialPropertyDrawer к свойству материала. Они позволяют управлять тем, как свойства материала отображаются в окне инспектора.
Атрибуты | Функции |
---|---|
[Gamma] |
Указывает, что свойство float или vector использует значения sRGB, что означает, что оно должно быть преобразовано вместе с другими значениями sRGB, если этого требует цветовое пространство в вашем проекте. Дополнительную информацию см. в разделе Свойства в шейдерных программах. |
[HDR] |
Указывает, что свойство текстуры или цвета использует значения высокого динамического диапазона (HDR).
Для свойств текстуры редактор Unity отображает предупреждение, если назначена текстура LDR. Для свойств цвета редактор Unity использует палитру цветов HDR для изменения этого значения. |
[HideInInspector] |
Указывает редактору Unity скрыть это свойство в инспекторе. |
[MainTexture] |
Задает основную текстуру для Материала, доступ к которой можно получить с помощью Material.mainTexture.
По умолчанию Unity считает текстуру с именем свойства Если вы используете этот атрибут более одного раза, Unity использует первое свойство и игнорирует последующие. Примечание. Когда вы устанавливаете основную текстуру с помощью этого атрибута, текстура не отображается в представлении "Игра" при использовании режима просмотра отладки потоковой передачи текстур или пользовательского инструмента отладки. |
[MainColor] |
Устанавливает основной цвет для Материала, доступ к которому можно получить с помощью Material.color.
По умолчанию Unity считает основным цветом цвет с именем свойства |
[NoScaleOffset] |
Указывает редактору Unity скрыть поля тайлинга и смещения для этого свойства текстуры. |
[Normal] |
Indicates that a texture property expects a normal map.
Редактор Unity отображает предупреждение, если вы назначаете несовместимую текстуру. |
[PerRendererData] |
Указывает, что свойство текстуры будет поступать из данных каждого средства визуализации в форме MaterialPropertyBlock.
Инспектор материалов показывает эти свойства как доступные только для чтения. |
Использование свойств материала с кодом C#
Свойства материалов представлены в коде C# классом MaterialProperty.
Чтобы получить доступ к переменным, определенным в вашем коде HLSL, вы можете вызвать Material.GetFloat, Материал.SetFloat. Есть и другие подобные методы; см. полный список в документации по Material API. Когда вы получаете доступ к переменным HLSL с помощью этих API, не имеет значения, является ли переменная свойством материала или нет.
В редакторе Unity вы можете управлять отображением свойств материала в окне инспектора. Самый простой способ сделать это — использовать MaterialPropertyDrawer. Для более сложных задач вы можете использовать MaterialEditor, MaterialProperty и ShaderGUI. Дополнительную информацию о создании пользовательских графических интерфейсов для шейдеров см. в разделе ShaderLab:назначение пользовательского редактора.
Использование свойств материала для установки переменных в коде ShaderLab
Чтобы задать значение переменной в коде ShaderLab из свойства материала, поместите имя свойства материала в квадратные скобки в коде ShaderLab.
В этом примере кода демонстрируется синтаксис использования свойства материала для установки значения единиц
команды ShaderLab Offset
.
Shader "Examples/MaterialPropertyShaderLab"
{
Properties
{
// Change this value in the Material Inspector to affect the value of the Offset command
_OffsetUnitScale ("Offset unit scale", Integer) = 1
}
SubShader
{
// The code that defines the rest of the SubShader goes here
Pass
{
Offset 0, [_OffsetUnitScale]
// The code that defines the rest of the Pass goes here
}
}
}
Using material properties to set variables in HLSL code
Чтобы задать значение переменной в коде HLSL с помощью свойства материала, присвойте свойству материала то же имя, что и свойству шейдера.
Вы можете увидеть этот метод в следующих статьях, которые включают примеры рабочего кода: