Shader объявляет свойства материала в блоке Properties. Если вы хотите получить доступ к некоторым из этих свойств в программе шейдера, вам необходимо объявить переменную Cg/HLSL с тем же именем и соответствующим типом.
Например, эти шейдерПрограмма, работающая на графическом процессоре. Подробнее
См. в Словарь:
_MyColor ("Some Color", Color) = (1,1,1,1)
_MyVector ("Some Vector", Vector) = (0,0,0,0)
_MyFloat ("My float", Float) = 0.5
_MyTexture ("Texture", 2D) = "white" {}
_MyCubemap ("Cubemap", CUBE) = "" {}
будет объявлен для доступа в коде Cg/HLSL как:
fixed4 _MyColor; // low precision type is usually enough for colors
float4 _MyVector;
float _MyFloat;
sampler2D _MyTexture;
samplerCUBE _MyCubemap;
Cg/HLSL также может принимать ключевое слово uniform, но это не обязательно:
uniform float4 _MyColor;
Типы свойств в ShaderLabязыке Unity для определения структуры объектов Shader. Подробнее
См. в Словарь сопоставление с типами переменных Cg/HLSL следующим образом:
- Свойства цвета и вектора сопоставляются с переменными float4, half4 или fixed4.
- Свойства Range и Float сопоставляются с переменными float, half или fixed.
- Свойства текстуры сопоставляются с переменными sampler2D для обычных (2D) текстур; CubemapsНабор из шести квадратных текстур, которые могут представлять отражения в окружающей среде или небоскреб, нарисованный позади вашей геометрии. Шесть квадратов образуют грани воображаемого куба, окружающего объект; каждая грань представляет вид по направлениям мировых осей (вверх, вниз, влево, вправо, вперед и назад). Подробнее
См. в Словарь сопоставление с samplerCUBE; а 3D-текстуры сопоставляются с sampler3D.
Как значения свойств передаются шейдерам
Значения свойств шейдера находятся и передаются шейдерам из следующих мест:
- Значения для каждого визуализатора устанавливаются в MaterialPropertyBlock. Обычно это данные «для каждого экземпляра» (например, настраиваемый цвет оттенка для множества объектов, которые используют один и тот же материал).
- Значения, заданные в Материалеактиве, который определяет, как поверхность должны быть визуализированы. Подробнее
См. в Словарь, который используется в визуализируемом объекте. - Глобальные свойства шейдера, устанавливаемые Unity рендерингпроцесс вывода графики на экран (или текстуру рендеринга) . По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
Смотреть в Словарь (см. встроенные переменные шейдера) или из ваших собственных скриптовфрагмент кода, который позволяет вам создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на ввод данных пользователем любым удобным для вас способом. Подробнее
См. в Словарь (например, Shader.SetGlobalTexture).
Порядок приоритета такой же, как и выше: данные для каждого экземпляра переопределяют все; затем используются данные материала; и, наконец, если свойство шейдера не существует в этих двух местах, используется значение глобального свойства. Наконец, если значение свойства шейдера нигде не определено, будет предоставлено значение по умолчанию (ноль для плавающих элементов, черный для цветов, пустая белая текстура для текстур).
Серийные свойства и свойства материала времени выполнения
Материалы могут содержать как сериализованные, так и заданные во время выполнения значения свойств.
Сериализованные данные — это все свойства, определенные в блоке Properties шейдера. Обычно это значения, которые должны быть сохранены в материале и могут быть изменены пользователем в Инспекторе материаловокне Unity, которое отображает информация о текущем выбранном игровом объекте, активе или настройках проекта, позволяющая просматривать и редактировать значения. Подробнее
См. в Словарь.
Материал также может иметь некоторые свойства, используемые шейдером, но не объявленные в блоке Properties шейдера. Обычно это свойства, которые устанавливаются из кода скрипта во время выполнения, например. через Material.SetColor. Обратите внимание, что матрицы и массивы могут существовать только как несериализованные свойства среды выполнения (поскольку их невозможно определить в блоке свойств).
Специальные свойства текстуры
Для каждой текстуры, настроенной как свойство шейдера/материала, Unity также устанавливает дополнительную информацию в дополнительных свойствах вектора.
Наложение текстуры и смещение
Материалы часто имеют поля Мозаика и Смещение для свойств текстуры. Эта информация передается в шейдеры в свойстве float4 {TextureName}_ST
:
x
содержит значение фрагмента Xy
содержит значение мозаики Yz
содержит значение смещения по оси Xw
содержит значение смещения по оси Y
Например, если шейдер содержит текстуру с именем _MainTex
, информация о мозаике будет в векторе _MainTex_ST
. р>
Размер текстуры
{TextureName}_TexelSize
— свойство float4 содержит информацию о размере текстуры:
x
содержит 1,0/ширинаy
содержит 1,0/высотаz
содержит ширинуw
содержит высоту
Параметры текстуры HDR
{TextureName}_HDR
— свойство float4 с информацией о том, как декодировать потенциально HDR. широкий динамический диапазон
См. в Словаре текстуру (например, в кодировке RGBM) в зависимости от цветовое пространство. См. функцию DecodeHDR
во включаемом файле шейдера UnityCG.cginc.
Цветовые пространства и данные цветового/векторного шейдера
При использовании линейного цветового пространства все свойства цвета материала предоставляются в виде цветов sRGB, но при передаче в шейдеры преобразуются в линейные значения.
Например, если ваш шейдерный блок Properties содержит свойство Color
с именем "MyColor", тогда соответствующая переменная HLSL «MyColor» получит линейное значение цвета.
Для свойств, помеченных как тип Float
или Vector
, по умолчанию преобразования цветового пространства не выполняются; предполагается, что они содержат нецветовые данные. Можно добавить атрибут [Gamma]
для свойств float/vector, чтобы указать, что они указаны в пространстве sRGB, как и цвета (см. Свойства).