Version: 2021.2
ShaderLab:向子着色器分配标签
ShaderLab:定义一个通道

ShaderLab:为子着色器指定 LOD 值

本页面包含有关在 ShaderLab 代码中使用 LOD 代码块为子着色器指定 LOD(细节级别)值的信息。

概述

可以将 LOD 值指定给子着色器。此值指示其计算方面的需求。

在运行时,您可以为单个 Shader 对象或所有 Shader 对象设置着色器 LOD 的值。然后 Unity 优先考虑具有较低 LOD 值的子着色器。有关 Unity 如何选择何时使用子着色器的信息,请参阅 Shader对象:渲染期间的操作顺序

注意: 尽管此方法以用于渲染网格的 LOD 功能命名,但是仍然存在重要区别:着色器 LOD 与相对于摄像机的距离无关,并且 Unity 不会自动计算着色器 LOD。必须手动设置最大着色器 LOD。

概述

使用此方法来微调不同硬件上的着色器性能。在用户的硬件理论上支持,但无法很好地运行子着色器时,这很有用。

渲染管线兼容性

功能名称 内置渲染管线 通用渲染管线 (URP) 高清渲染管线 (HDRP) 自定义 SRP
ShaderLab:子着色器 LOD 代码块

使用 LOD 代码块

在 ShaderLab 中,可以通过将 LOD 代码块置于 SubShader 代码块中来为子着色器指定 LOD 值。

签名 功能
LOD [value] 将给定的 LOD 值指定给子着色器。

注意:在您的 Shader 代码块中,必须将子着色器按 LOD 降序排列。例如,如果您有 LOD 值为 200、100 和 500 的子着色器,则必须先放置 LOD 值为 500 的子着色器,然后是 LOD 值为 200 的子着色器,然后是 LOD 值为 100 的子着色器。这是因为 Unity 选择所找到的第一个有效子着色器,所以如果它首先找到一个 LOD 较低的子着色器,它将始终使用它。

通过 C# 代码使用子着色器 LOD 值

要为给定的 Shader 对象设置着色器 LOD,您可以使用 Shader.maximumLOD。要为所有 Shader 对象设置着色器 LOD,您可以使用 Shader.globalMaximumLOD。默认情况下,没有最大 LOD。

代码示例

此示例代码创建了一个包含两个子着色器的 Shader 对象:一个 LOD 值为 200,一个值为 100。子着色器按 LOD 值的降序排列。

Shader "Examples/ExampleLOD"
{
    SubShader
    {
        LOD 200

        Pass
        {                
              // 此处是定义通道的代码的其余部分。
        }
    }

    SubShader
    {
        LOD 100

        Pass
        {                
              // 此处是定义通道的代码的其余部分。
        }
    }
}

Unity 内置着色器的 LOD 值

在内置渲染管线中,Unity 的内置着色器具有以下 LOD 值:

LOD 值 着色器名称
100 Unlit/Texture
Unlit/Color
Unlit/Transparent
Unlit/Transparent Cutout
300 Standard
Standard (Specular Setup)
Autodesk Interactive

旧版着色器的 LOD 值

在内置渲染管线中,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)
ShaderLab:向子着色器分配标签
ShaderLab:定义一个通道