Параметры материала и освещения используются для управления встроенным вершинным освещением. Вершинное освещение - это стандартная Direct3D/OpenGL модель освещения, которая просчитывается для каждой вершины. Lighting on включает освещение. На освещение влияет блок Material и команды ColorMaterial и SeparateSpecular .
Попиксельные источники света обычно реализуются с помощью пользовательских вершинных/фрагментных программ и не используют вершинное освещение. Для этого, вам не понадобятся какие-либо команды описанные здесь. Вместо этого, напишите свои собственные вершинные и фрагментные программы, где вы прописываете освещение, текстуры и что угодно сами.
Вершинные освещение и окраска - это первый эффект, который будет просчитан для любой рендерящейся геометрии. Оно работает на уровне вершин и рассчитывает используемый цвет основы ещё до применения текстур.
Команды верхнего уровня контролируют, использовать ли fixed function освещение или нет и некоторые другие настройки. Главная система в блоке Material расписана детально ниже.
Color color
Задаёт объекту равномерный цвет. Цвет указывается либо в виде 4-х RGBA значений во вставке, либо именем цвета в квадратных скобках.
Material {Material Block}
Блок Material используется для указания свойств материала объекта.
Lighting On | Off
Чтобы настройки, определённые в блоке Material, возымели эффект, вы должны включить освещение командой Lighting On. Если освещение наоборот выключено, то цвет берётся напрямую из команды Color.
SeparateSpecular On | Off
Это команда добавляет отражение света в конце прохода шейдера, таким образом, освещение не подвержено влиянию текстур. Работает, только если используется команда Lighting On.
ColorMaterial AmbientAndDiffuse | Emission
Эта команда использует повертексный цвет вместо набора цветов в материале. AmbientAndDiffuse заменяет значения материала Ambient и Diffuse; Emission заменяет значение материала Emission.
Он содержит настройки того, как материал должен реагировать на свет. Любая из этих настроек может быть выкинута, в результате чего они по умолчанию будут чёрными (другими словами, эффекта не будет).
Diffuse color: Настройка диффузного цвета. Это базовый цвет объекта.
Ambient color: Настройка внешнего цвета. Объект приобретает этот цвет при попадании на него света окружающей среды, указанного в настройках рендера.
Specular color: Цвет светового отражения.
Shininess number: Резкость зоны подсветки отражения света в пределах от 0 до 1. При значении 0, у вас будет огромная зона подсветки, которая уже будет больше походить на диффузное освещение, при значении 1, у вас будет крошечное пятнышко.
Emission color: Цвет объекта, когда на него не падает свет.
Итоговый цвет источников света падающих на объект:
Ambient * Lighting Window’s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission
Выделенные части уравнения (вместе со скобками) повторяются для каждого источника света, что падает на объект.
Скорее всего, вы захотите, чтобы Diffuse и Ambient цвета были одинаковыми (так сделано во всех встроенных в Unity шейдерах).
Всегда рендерить объект в красных цветах:
Shader "Solid Red" {
SubShader {
Pass { Color (1,0,0,0) }
}
}
Базовый шейдер, который окрашивает объект в белый и применяет вершинное освещение:
Shader "VertexLit White" {
SubShader {
Pass {
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting On
}
}
}
Расширенная версия, которая добавляет цвет материала как видимое свойство в инспекторе материалов:
Shader "VertexLit Simple" {
Properties {
_Color ("Main Color", COLOR) = (1,1,1,1)
}
SubShader {
Pass {
Material {
Diffuse [_Color]
Ambient [_Color]
}
Lighting On
}
}
}
И, наконец, полноценный шейдер вершинного освещения (см. также страницу справки по SetTexture):
Shader "VertexLit" {
Properties {
_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 {
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting On
SeparateSpecular On
SetTexture [_MainTex] {
Combine texture * primary DOUBLE, texture * primary
}
}
}
}