本页面包含有关在 ShaderLab 代码中使用 LOD 代码块为子着色器指定 LOD(细节级别)值的信息。
可以将 LOD 值指定给子着色器。此值指示其计算方面的需求。
At runtime, you can set the shader LOD value for a single Shader object, or for all Shader objects. Unity then prioritises SubShaders that have a lower LOD value. For information on how Unity chooses when to use SubShaders, see How Unity selects a subshader.
注意: 尽管此方法以用于渲染网格的 LOD 功能命名,但是仍然存在重要区别:着色器 LOD 与相对于摄像机的距离无关,并且 Unity 不会自动计算着色器 LOD。必须手动设置最大着色器 LOD。
使用此方法来微调不同硬件上的着色器性能。在用户的硬件理论上支持,但无法很好地运行子着色器时,这很有用。
| 功能名称 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义 SRP | 
|---|---|---|---|---|
| ShaderLab:子着色器 LOD 代码块 | 是 | 是 | 是 | 是 | 
在 ShaderLab 中,可以通过将 LOD 代码块置于 SubShader 代码块中来为子着色器指定 LOD 值。
| 签名 | 功能 | 
|---|---|
| LOD [value] | 将给定的 LOD 值指定给子着色器。 | 
注意:在您的 Shader 代码块中,必须将子着色器按 LOD 降序排列。例如,如果您有 LOD 值为 200、100 和 500 的子着色器,则必须先放置 LOD 值为 500 的子着色器,然后是 LOD 值为 200 的子着色器,然后是 LOD 值为 100 的子着色器。这是因为 Unity 选择所找到的第一个有效子着色器,所以如果它首先找到一个 LOD 较低的子着色器,它将始终使用它。
To set the shader LOD for a given Shader object, you can use Shader.maximumLOD. To set the shader LOD for all Shader objects, you can use Shader.globalMaximumLOD. By default, there is no maximum LOD.
此示例代码创建了一个包含两个子着色器的 Shader 对象:一个 LOD 值为 200,一个值为 100。子着色器按 LOD 值的降序排列。
Shader "Examples/ExampleLOD"
{
    SubShader
    {
        LOD 200
        Pass
        {                
              // 此处是定义通道的代码的其余部分。
        }
    }
    SubShader
    {
        LOD 100
        Pass
        {                
              // 此处是定义通道的代码的其余部分。
        }
    }
}
在内置渲染管线中,Unity 的内置着色器具有以下 LOD 值:
| LOD 值 | 着色器名称 | 
|---|---|
| 100 | Unlit/Texture Unlit/Color Unlit/Transparent Unlit/Transparent Cutout | 
| 300 | Standard Standard (Specular Setup) Autodesk Interactive | 
在内置渲染管线中,Unity 的内置旧版着色器具有以下 LOD 值:
| LOD 值 | 着色器名称 | 
|---|---|
| 100 | 顶点光照 (VertexLit) | 
| 150 | 贴花 (Decal) 反光顶点光照 (Reflective VertexLit) | 
| 200 | 漫射 (Diffuse) | 
| 250 | 漫射细节 (Diffuse Detail) 反光凹凸无光照 (Reflective Bumped Unlit) 反光凹凸顶点光照 (Reflective Bumped VertexLit) | 
| 300 | 凹凸 (Bumped) 镜面反射 (Specular) | 
| 400 | 凹凸镜面反射 (Bumped Specular) | 
| 500 | 视差 (Parallax) | 
| 600 | 视差镜面反射 (Parallax Specular) |