注意:
此页面介绍的 ShaderLab 功能已过时,仅为向后兼容而记录。如果着色器源文件包含 HLSL 代码,Unity 会完全忽略这些命令;若不包含 HLSL 代码,Unity 会在导入时将这些命令编译为常规着色器程序。
渲染管线兼容性
功能名称 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义 SRP |
---|---|---|---|---|
旧版光照系统 | ✔️ 支持 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
概述
材质和光照参数用于控制内置顶点光照。顶点光照是基于每个顶点计算的标准 Direct3D/OpenGL 光照模型。通过Lighting On
启用光照,光照效果受Material
块、ColorMaterial
和SeparateSpecular
命令影响。
顶点着色与光照是所有渲染几何体的首个计算效果,它在顶点级别运算,计算纹理应用前的基础颜色。
语法说明
顶级命令用于控制是否使用固定函数光照及部分配置选项,核心设置包含在Material
块中(详见下文)。
1. Color
命令
hlsl
Color color
- 将对象设置为纯色。
color
可以是括号内的四个 RGBA 值,或方括号内的颜色属性名称。
2. Material
块
hlsl
Material {
// 材质属性配置
}
用于定义对象的材质属性,可省略部分属性(默认值为黑色,即无效果):
- Diffuse:漫反射颜色,对象的基础颜色。
- Ambient:环境光颜色,受 Lighting 窗口中环境光设置影响。
- Specular:高光颜色,决定高光外观。
- Shininess:光泽度(0-1),值越小高光越柔和,值越大高光越锐利。
- Emission:自发光颜色,不受光照影响的颜色。
3. Lighting
命令
hlsl
Lighting On | Off
- On:启用内置顶点光照,材质块属性生效。
- Off:禁用光照,直接使用
Color
命令指定的颜色。
4. SeparateSpecular
命令
hlsl
SeparateSpecular On | Off
- On:将高光光照独立计算并叠加到最终颜色,不受纹理影响(仅在
Lighting On
时有效)。 - Off:高光与漫反射共同受纹理影响(默认行为)。
5. ColorMaterial
命令
hlsl
ColorMaterial AmbientAndDiffuse | Emission
- AmbientAndDiffuse:使用顶点颜色覆盖材质的环境光和漫反射颜色。
- Emission:使用顶点颜色覆盖材质的自发光颜色。
光照计算公式
对象最终颜色 =
环境光 × 项目环境光强度
+
Σ(灯光颜色 × 漫反射 + 灯光颜色 × 高光)
+
自发光颜色
(括号内部分对每个影响对象的灯光重复计算)
最佳实践:通常保持漫反射(Diffuse)与环境光(Ambient)颜色一致(所有内置着色器均遵循此规则)。
示例代码
示例 1:纯红色对象(无光照)
hlsl
Shader "Solid Red" {
SubShader {
Pass { Color (1,0,0,0) } // RGBA纯红色(Alpha=0不影响,因无混合)
}
}
示例 2:白色顶点光照对象
hlsl
Shader "VertexLit White" {
SubShader {
Pass {
Material {
Diffuse (1,1,1,1) // 漫反射白色
Ambient (1,1,1,1) // 环境光白色(与漫反射一致)
}
Lighting On // 启用光照
}
}
}
示例 3:带材质属性的顶点光照
hlsl
Shader "VertexLit Simple" {
Properties {
_Color ("Main Color", COLOR) = (1,1,1,1) // 暴露颜色属性到材质面板
}
SubShader {
Pass {
Material {
Diffuse [_Color] // 使用属性值作为漫反射
Ambient [_Color] // 使用属性值作为环境光
}
Lighting On
}
}
}
示例 4:完整顶点光照着色器(含纹理)
hlsl
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
}
}
}
}
注意事项
- 局限性:旧版光照仅支持顶点级光照计算,无法实现像素级光照(如 PBR 效果)。
- 管线兼容性:URP/HDRP/SRP 均不支持此功能,建议迁移至可编程渲染管线(如使用 HLSL 编写光照逻辑)。
- 性能影响:固定函数管线性能较低,现代项目应优先使用 ShaderLab 的可编程功能(如
HLSLPROGRAM
块)。