ShaderLab: Legacy Lighting
材质和光照参数被用来控制内建的顶点光照。顶点光照是标准的 Direct3D/OpenGL 光照模型用来计算每个顶点的光照。Lighting on 将其打开。光照被 Material 模块影响, ColorMaterial 和 SeparateSpecular 命令.
Note: 当vertex programs被使用时 Material/Lighting 命令不会生效;在这种情况下,所有的计算都被完整的描述在shader中。目前使用可编程 shader 代替旧的顶点光照是明智的。这样你不需要使用任何命令描述,而是自定义 vertex and fragment programs ,来做所有的光照,贴图和其他任何事。
对于任何几和渲染,顶点的颜色和光照影响都是第一个被计算的。它在顶点级别被操作,并计算在应用纹理之前它的基础颜色。
Syntax
顶层的命了控制了是否使用固定管线光照,和一些配置选项。主要的步骤是在 Material Block,将在后边介绍。
Color
Color color
将对象设为纯色。颜色是在圆括号中的RGBA值,或在方括号中的颜色属性名称。
Material
Material {Material Block}
Material 块用来定义对象的材质属性。
Lighting
Lighting On | Off
为了使定义在材质块中的设置有效,你必须使用 Lighting On 命令开启光照。如果光照是关闭状态,颜色会直接从 Color 命令获得。
SeparateSpecular
SeparateSpecular On | Off
该命令使镜面光泽被加到shader pass的最后,因此,镜面光泽不受纹理化影响。只有当 Lighting On 被使用时,才有效。
ColorMaterial
ColorMaterial AmbientAndDiffuse | Emission
让逐顶点颜色代替材质中的颜色。AmbientAndDiffuse 代替材质中的 Ambient 和 Diffuse 值; Emission 代替材质中的 Emission 值。
Material Block
该块包含了材质对光的响应的设置。任何属性都可以忽略,这种情况下,它们默认为黑色(例如 没有效果)。
Diffuse color: The diffuse color component. 这是一个对象的基础颜色。
Ambient color: The ambient color component. 这是当物体被 ambient light 照射时的颜色。在 Lighting Window中设置。
Specular color: 对象高光的颜色。
Shininess number: 高光的锐度, 在 0 和 1 之间。 当值为 0 你会得到一个巨大的高光,它看起来更像漫反射光,为 1 时你会得到一个小光斑。
Emission color: 当物体没有被任何光照亮时的颜色。
所有光击中物体后的颜色是:
Ambient * Lighting Window’s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission
等式中的光照部分,被复用于所有击中该对象的光。
通常,你希望漫反射的光照与环境光颜色相同。(所有 built-in Unity shaders 都是这样).
Examples
总是渲染物体为纯红色:
Shader "Solid Red" {
SubShader {
Pass { Color (1,0,0,0) }
}
}
基础的shader,用来给物体上色为白色,并提供顶点光照:
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
}
}
}
最后,一个完全成熟的顶点光照shader (see also SetTexture reference page):
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
}
}
}
}