Version: Unity 6.0 (6000.0)
语言 : 中文
编写适用于多个平台的计算着色器
在 URP 中编写自定义着色器

优化着色器

本页面介绍了关于优化着色器以提高运行时性能的信息,尤其针对 GPU 性能有限的移动平台。

避免复杂的计算

要避免复杂的计算,请执行以下操作,例如:

  • 使用查找纹理而不是资源密集型函数,例如 powlogsin
  • 使用 Unity HLSL 函数,例如 normalizedot,而不是编写自己的函数。这可以确保驱动程序生成更好的代码。

避免重复计算

要避免着色器重复计算,请执行以下操作,例如:

  • 将计算从片段着色器转移到顶点着色器,这样它们就只会针对每个顶点运行,而不是针对每个片段运行。
  • 改用 C# 脚本进行计算,然后在着色器中使用计算出的值。
  • 避免不必要的计算。例如,如果您始终使用相同的颜色,请删除让同一材质使用多种颜色的代码。

使用精度较低的数据类型

对除世界空间坐标和纹理坐标之外的所有变量使用 half 而不是 float。详情请参阅在着色器中使用 16 位精度

使用类型转换而非后缀

Unity 不支持后缀,因此 2.0h 之类的值将成为完整的 float。这意味着当 GPU 进行计算时,可能需要将其他值来回转换为 float。这可能会减慢着色器的速度。

要防止这种情况,请使用类型转换 (Cast) 而不是后缀。例如,使用 half(2.0) 而不是 2.0h

避免丢弃像素或通道

要避免着色器变慢,请避免以下资源密集型方法:

  • 片元着色器中的 discard 方法。
  • 移动平台上的 ColorMask

避免写入深度缓冲区

为确保移动端 GPU 可以使用早期深度测试来加快渲染速度,请勿在片元着色器中的深度缓冲区进行写入。

如需详细了解深度测试,请参阅 ShaderLab 命令:ZTest

其他资源

编写适用于多个平台的计算着色器
在 URP 中编写自定义着色器