本页面包含有关在 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) |