版本:Unity 6 (6000.0)
语言:English
为多个平台编写计算着色器
URP 中的着色器

优化着色器

此页面包含有关优化您的着色器在 GPU 上运行的程序。 更多信息
参见 术语表
以提高运行时性能,尤其是在 GPU 性能有限的移动平台上。

避免复杂的计算

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

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

避免重复计算

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

  • 将计算从片段着色器移动到顶点着色器在渲染 3D 模型时,在模型的每个顶点上运行的程序。 更多信息
    参见 术语表
    ,以便它们仅对每个顶点运行,而不是对每个片段运行。
  • 在 C# 脚本中执行计算,然后在着色器中使用计算出的值。
  • 避免不必要的计算。例如,如果您始终使用相同的颜色,请删除支持每种材质多种颜色的代码。

使用较低精度的數據類型

对于除世界空间坐标和纹理坐标以外的所有变量,请使用 half 代替 float。有关更多信息,请参阅 在着色器中使用 16 位精度

使用强制转换而不是后缀

Unity 不支持后缀,因此像 2.0h 这样的值会变成完整的 float。这意味着当 GPU 执行计算时,可能需要将其他值转换为 float 并转换回来。这可能会降低着色器的速度。

为避免这种情况,请使用强制转换而不是后缀。例如,使用 half(2.0) 代替 2.0h

避免丢弃像素或通道

为避免着色器速度变慢,请避免以下资源密集型方法

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

避免写入深度缓冲区

为了确保移动 GPU 可以使用早期深度测试来加快渲染速度,请不要在片段着色器中写入深度缓冲区一个内存存储,用于保存图像中每个像素的 z 值深度,其中 z 值是从投影平面到每个渲染像素的深度。 更多信息
参见 术语表

有关深度测试的更多信息,请参阅 ShaderLab 命令:ZTest

其他资源

为多个平台编写计算着色器
URP 中的着色器