优化 HLSL 着色器

本部分介绍可用于优化着色器常规用途策略。 可以将这些策略应用于在任何平台上以任何语言编写的着色器。

了解在何处执行着色器计算

顶点着色器执行的操作包括提取顶点和执行顶点数据的矩阵转换。 通常,顶点着色器按每个顶点执行一次。

像素着色器执行的操作包括提取纹理数据和执行照明计算。 通常,对于给定的几何图形块,像素着色器每像素执行一次。

通常,场景中的像素数超过顶点数,因此像素着色器的执行频率高于顶点着色器。

设计着色器算法时,请记住以下事项:

  • 如果可能,请对顶点着色器执行计算。 对像素着色器执行的计算比在顶点着色器上执行的计算要昂贵得多。
  • 请考虑使用每顶点计算来提高密集网格等情况下的性能。 对于密集网格,每个顶点的计算可能会生成与使用每像素计算生成的结果在视觉上不一致的结果。

跳过不必要的指令

在 HLSL 中,动态分支提供限制执行指令数的能力。 因此,动态分支有助于加快着色器执行时间。 如果未显示几何图形或像素,请使用动态分支退出着色器或限制指令。 例如,如果像素未亮起,则执行照明算法没有意义。

下表列出了一些可以在着色器中测试条件并使用动态分支跳过不必要的指令的情况。 该表并不全面。 相反,它旨在提供优化代码的思路。

要检查的条件 着色器中的响应
Alpha 检查确定不会看到像素。 跳过着色器的其余部分。
像素或几何图形是完全伪造的。 跳过着色器的其余部分。
外观权重为零。 跳过跳过。
光衰减为零。 跳过照明。
非正 Lambertian 术语。 跳过照明。

Pack 变量和内插

请注意着色器数据所需的空间。 将尽可能多的信息打包到变量或内插中。 有时,两个变量的信息可以打包到单个变量的内存空间中。

降低着色器复杂性

使着色器保持小而简单。 通常,与具有更多指令的着色器相比,具有较少指令的着色器的执行速度更快。 此外,调试和优化较小、不太复杂的着色器也更容易。

HLSL 编程指南

HLSL 编程指南