优化 HLSL 着色器
本部分介绍可用于优化着色器的常规用途策略。 可以在任何平台上将这些策略应用于以任何语言编写的着色器。
了解在何处执行着色器计算
顶点着色器执行包括提取顶点和对顶点数据执行矩阵转换的操作。 通常,每个顶点执行一次顶点着色器。
像素着色器执行包括提取纹理数据和执行照明计算的操作。 通常,对于给定的几何图形,每个像素执行一次像素着色器。
通常,像素在场景中超过顶点数,因此像素着色器执行的频率高于顶点着色器。
设计着色器算法时,请记住以下事项:
- 如果可能,对顶点着色器执行计算。 与在顶点着色器上执行的计算相比,在像素着色器上执行的计算要昂贵得多。
- 请考虑使用每个顶点计算来提高密集网格等情况下的性能。 对于密集网格,每个顶点计算可能会生成与每像素计算生成的结果在视觉上无法区分的结果。
跳过不必要的说明
在 HLSL 中,动态分支提供限制所执行的指令数的功能。 因此,动态分支可帮助加快着色器执行时间。 如果未显示几何图形或像素,请使用动态分支退出着色器或限制指令。 例如,如果像素未点燃,则执行照明算法没有任何意义。
下表列出了可在着色器中测试条件并使用动态分支跳过不必要的说明的一些情况。 表不全面。 相反,它旨在为你提供优化代码的想法。
要检查的条件 | 着色器中的响应 |
---|---|
Alpha 检查确定将看不到像素。 | 跳过着色器的其余部分。 |
像素或几何图形完全雾化。 | 跳过着色器的其余部分。 |
皮肤重量为零。 | 跳过骨骼。 |
光衰减为零。 | 跳过照明。 |
非正兰贝蒂安术语。 | 跳过照明。 |
Pack 变量和内插
请注意着色器数据所需的空间。 将尽可能多的信息打包到变量或内插中。 有时,两个变量中的信息可以打包到单个变量的内存空间中。
降低着色器复杂性
使着色器保持较小且简单。 通常,指令较少的着色器比具有更多指令的着色器执行速度更快。 调试和优化更小、不太复杂的着色器也更容易。
相关主题
相关主题