Примечание. ShaderLabязык Unity для определения структуры объектов Shader. Подробнее
See in Словарь на этой странице является устаревшей и задокументирован только для обратной совместимости. Если ваш шейдерПрограмма, работающая на графическом процессоре. Подробнее
См. в Словарь исходный файл включает код HLSL, Unity полностью игнорирует эти команды. Если исходный файл шейдера не включает код HLSL, Unity компилирует эти команды в обычные программы шейдера при импорте.
Совместимость конвейера рендеринга
Название функции | Встроенный конвейер рендеринга | Универсальный конвейер рендеринга (URP) | Конвейер рендеринга высокого разрешения (HDRP) | Пользовательский SRP |
---|---|---|---|---|
Legacy texture combining | Да | Нет | Нет | Нет |
После расчета базового освещения вершин применяются текстуры. В ShaderLab это делается с помощью команды SetTexture.
Текстурирование с фиксированной функцией — это место, где можно создавать эффекты комбинирования в старом стиле. Внутри прохода может быть несколько команд SetTexture — все текстуры применяются последовательно, как слои в программе рисования. Команды SetTexture должны располагаться в конце Pass.
Синтаксис
SetTexture [TextureName] {блок текстуры
Назначает текстуру. TextureName должен быть определен как свойство текстуры. Способ применения текстуры определяется внутри TextureBlock.
Блок текстуры определяет способ применения текстуры. Внутри блока текстуры может быть до двух команд: combine
и constantColor
.
Текстурный блок команда объединения
объединить
src1 * src2: умножает src1 и src2 вместе. Результат будет темнее, чем любой вход.
объединить
src1 + src2: объединяет src1 и src2. Результат будет светлее, чем любой вход.
объединить
src1 - src2: вычесть src2 из src1.
объединить
src1 lerp
(src2) src3: интерполяция между src3 и src1 с использованием альфа-канала src2. Обратите внимание, что интерполяция выполняется в противоположном направлении: src1 используется, когда альфа равна единице, а src3 используется, когда альфа равна нулю.
объединить
src1 * src2 + src3: умножает src1 на альфа-компонент src2, затем добавляет src3.
Все свойства src могут быть одним из следующих: previous, constant, primary или texture. .
- Previous – это результат предыдущего SetTexture.
- Основным является цвет из расчета освещения или цвет вершин, если он привязан.
- Texture – это цвет текстуры, заданный параметром TextureName в SetTexture (см. выше).
- Constant — это цвет, указанный в ConstantColor.
Модификаторы:
- За приведенными выше формулами могут дополнительно следовать ключевые слова Двойной или Квадратный Примитивный объект, напоминающий плоскость, но длина его ребер составляет всего одну единицу, он использует только 4 вершины, а поверхность ориентирована в плоскости XY локального координатного пространства. Подробнее
См. в Словарь, чтобы сделать результирующий цвет 2x или 4x как яркий. - Всем свойствам src, кроме аргумента
lerp
, может предшествовать единица -, чтобы результирующий цвет отрицание. - За всеми свойствами src может следовать alpha, чтобы использовать только альфа-канал.
Блок текстуры constantColor
команда
ConstantColor color: определяет постоянный цвет, который можно использовать в команде объединения.
Функции удалены в Unity 5.0
Версии Unity до 5.0 поддерживали преобразования координат текстуры с помощью команды matrix
внутри блока текстуры. Если вам нужна эта функциональность сейчас, подумайте о том, чтобы вместо этого переписать свой шейдер как программируемый шейдер и выполнить преобразование UV в вершинный шейдерПрограмма, которая запускается для каждой вершины 3D-модели во время рендеринга модели. Подробнее
См. в Словарь.
Аналогично, в версии 5.0 удалено добавление со знаком (a+-b
), добавление с несколькими знаками (a*b+-c
), умножить вычесть (a*bc
) и скалярное произведение (dot3
, dot3rgba
) режимы комбинирования текстур. Если они вам нужны, посчитайте в пикселенаименьшей единице компьютерного изображения. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. Подробнее
см. в Словарь.
Подробнее
До того, как появились фрагментные программы, старые видеокарты использовали многоуровневый подход к текстурам. Текстуры применяются одна за другой, изменяя цвет, который будет записан на экран. Для каждой текстуры текстура обычно объединяется с результатом предыдущей операции. В наши дни рекомендуется использовать настоящие фрагментные программы.
Обратите внимание, что каждый этап текстуры может быть ограничен диапазоном 0–1, а может и нет, в зависимости от платформы. Это может повлиять на этапы SetTexture, которые могут создавать значения выше 1,0.
Отдельное вычисление альфа-канала и цвета
По умолчанию формула объединителя используется для вычисления как RGB-, так и альфа-компонента цвета. При желании вы можете указать отдельную формулу для альфа-расчета. Это выглядит так:
SetTexture [_MainTex] { объединить предыдущую * текстуру, предыдущую + текстуру
Здесь мы умножаем цвета RGB и добавляем альфа-канал.
Яркие блики
По умолчанию основной цвет представляет собой сумму рассеянного, окружающего и зеркального цветов цвет блика.
См. в Словарь (как определено в Расчет освещения). Если вы укажете SeparateSpecular On в параметрах прохода, цвет отражения будет добавлен после вычисления комбайнера, а не до него. Это поведение встроенного шейдера VertexLit по умолчанию.
Поддержка графического оборудования
Современные видеокарты с поддержкой фрагментных шейдеров ("шейдерная модель 2.0" на настольных компьютерах, OpenGL ES 2.0 на мобильных устройствах) поддерживают все режимы SetTexture и не менее 4 текстурных стадий (многие из них поддерживают 8). Если вы работаете на очень старом оборудовании (сделанном до 2003 года на ПК или до iPhone3GS на мобильных устройствах), у вас может быть всего два этапа текстуры. Автор шейдера должен написать отдельные подшейдеры для карт, которые он хочет поддерживать.
Примеры
Альфа-смешивание двух текстур
В этом небольшом примере используются две текстуры. Сначала он устанавливает первый объединитель так, чтобы он просто брал _MainTex, а затем использует альфа-канал _BlendTex для постепенного появления цветов RGB _BlendTex
Shader "Examples/2 Alpha Blended Textures" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
}
SubShader {
Pass {
// Apply base texture
SetTexture [_MainTex] {
combine texture
}
// Blend in the alpha texture using the lerp operator
SetTexture [_BlendTex] {
combine texture lerp (texture) previous
}
}
}
}
Самовосвещение с альфа-контролем
Этот шейдер использует альфа-компонент _MainTex, чтобы решить, где применить освещение. Это делается путем применения текстуры к двум этапам; На первом этапе альфа-значение текстуры используется для смешивания цвета вершин и сплошного белого. На втором этапе значения RGB текстуры перемножаются.
Shader "Examples/Self-Illumination" {
Properties {
_MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
}
SubShader {
Pass {
// Set up basic white vertex lighting
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting On
// Use texture alpha to blend up to white (= full illumination)
SetTexture [_MainTex] {
constantColor (1,1,1,1)
combine constant lerp(texture) previous
}
// Multiply in texture
SetTexture [_MainTex] {
combine previous * texture
}
}
}
}
Тем не менее, здесь мы можем сделать что-то еще бесплатно; вместо смешивания со сплошным белым цветом мы можем добавить цвет самоподсветки и смешать его. Обратите внимание на использование ConstantColor для получения _SolidColor из свойств при наложении текстуры.
Shader "Examples/Self-Illumination 2" {
Properties {
_IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
}
SubShader {
Pass {
// Set up basic white vertex lighting
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting On
// Use texture alpha to blend up to white (= full illumination)
SetTexture [_MainTex] {
// Pull the color property into this blender
constantColor [_IlluminCol]
// And use the texture's alpha to blend between it and
// vertex color
combine constant lerp(texture) previous
}
// Multiply in texture
SetTexture [_MainTex] {
combine previous * texture
}
}
}
}
И, наконец, мы берем все свойства освещения шейдера vertexlit и используем их:
Shader "Examples/Self-Illumination 3" {
Properties {
_IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
_Color ("Main Color", Color) = (1,1,1,0)
_SpecColor ("Spec Color", Color) = (1,1,1,1)
_Emission ("Emmisive Color", Color) = (0,0,0,0)
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Pass {
// Set up basic vertex lighting
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting On
// Use texture alpha to blend up to white (= full illumination)
SetTexture [_MainTex] {
constantColor [_IlluminCol]
combine constant lerp(texture) previous
}
// Multiply in texture
SetTexture [_MainTex] {
combine previous * texture
}
}
}
}