注意:此页面上的__ ShaderLab__Unity 用于定义着色器对象结构的语言。更多信息
See in Glossary 是旧版功能,仅用于向下兼容。如果您的着色器源文件包含 HLSL 代码,则 Unity 会完全忽略这些命令。如果您的着色器源文件不包含 HLSL 代码,则 Unity 会在导入时将这些命令编译为常规着色器程序。
| 功能名称 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义 SRP |
|---|---|---|---|---|
| 旧版光照 | 是 | 否 | 否 | 否 |
材质和光照参数负责控制内置顶点光照。顶点光照是针对顶点逐个计算的标准 Direct3D/OpenGL 光照模型。Lighting on 命令可开启光照。光照受 Material 代码块、ColorMaterial 命令和 SeparateSpecular 命令的影响。
对任何渲染的几何体来说,第一个要计算的效果就是顶点着色和光照。此效果在顶点级别上运行,并计算在应用纹理之前使用的基色。
顶级命令负责控制是否使用固定函数光照,以及一些配置选项。主要的设置位于 Material 代码块中,下文进行了详细介绍。
Color color
将对象设置为纯色。颜色是用圆括号括起的四个 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):任何光源均未照射到对象时对象的颜色。
照射到对象的光源的完整颜色为:
环境光 * 光照窗口中的环境强度设置 + (光源颜色 * 漫反射 + 光源颜色 * 镜面反射) + 自发光
对于照射到对象的所有光源,重复该等式(圆括号内的)光源部分。
一般而言,您需要让漫反射和环境光颜色相同(所有内置着色器都会如此)。
始终以纯红色渲染对象:
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
}
}
}
}