着色器最佳实践

应用程序会花费相当多的时间执行着色器程序。尤其是在移动和嵌入式硬件上,着色器可能引发许多问题,包括性能瓶颈和图形瑕疵。正确使用着色器可以在 CPU 和 GPU 之间分配计算,从而帮助您获得出色的图形质量和性能。您必须决定是在片段着色器还是在顶点着色器中执行计算。

一个着色器程序的顶点着色器对每个顶点运行一次,而其片段着色器对每个像素运行一次。通常,像素的数量比顶点多一个数量级。出于这个原因,最佳实践是在顶点着色器中尽可能多地进行计算,并在片段着色器中使用结果。

要使用几何着色器和曲面细分着色器,运行 Kanzi 应用程序的硬件必须支持 OpenGL ES 3.2 或 Vulkan 1.1。请注意,几何着色器和曲面细分着色器可能会降低分块渲染架构上的性能。因此,建议避免在移动和嵌入式硬件上使用几何着色器和曲面细分着色器。

一些最常见的着色器瓶颈包括:

  • 在片段着色器中执行不必要的计算或者是重型的片段着色器。请参阅 优化片段着色器。

  • 具有长顶点着色器的3D模型。如果顶点着色器是瓶颈,请减少指令数量以提高性能。如果片段着色器是瓶颈,则顶点着色器中的优化不会影响性能。

  • 在屏幕上显示很多需要填充大量像素的片段。

  • 发送到 GPU 并由顶点着色器处理的顶点。三角形计数提供了每帧绘制的顶点计数的提示。请参阅 排除应用程序性能问题。

Kanzi Studio 为不同的着色器配置文件提供这些模板:

  • High performance vertex shaders 模板适用于低精度、高性能的应用程序。它包含基于顶点的着色器。大部分 GPU 相关计算(包括使用 Phong 反射模型应用光源)都在顶点着色器中完成。对于大多数设备来说,这是一个很好的起点。

    High performance vertex shaders 材质类型中提供的基于顶点的着色是移动 GPU 的一个不错选择,因为基于顶点的着色成本较低。

  • High quality fragment shaders 模板适用于高精度应用程序。它包含基于像素着色器的材质。大部分 GPU 相关计算(包括使用 Phong 反射模型应用光源)都在片段着色器中完成。这样可以提供更好的图像质量,但往往以牺牲性能为代价。

  • Physically based rendering 模板适用于现代应用程序。它包含基于实现了基于物理的渲染 (PBR) 原理的着色器的材质。这些材质的属性表示物理属性(例如金属度),因此便于直观地控制。大部分 GPU 相关计算(包括使用基于物理的光照模型应用光源)都在片段着色器中完成。这样可以在多种光照条件下提供更逼真的渲染效果。

根据图形硬件和场景的复杂性,着色器可能会对应用程序性能产生重大影响。

../../_images/use-appropriate-project-template.png

您可以降低着色器中 uniform 以及着色器输入和输出的精度,以优化性能。着色器中的精度是 OpenGL ES 和 Vulkan 特有的。

对于移动和嵌入式设备,使用:

  • 所有范围为 [-2..2] 的变量精度较低。

  • 对于不需要32位浮点全精度的其他变量,使用中等精度。

着色器是特定于材质的。您可以直接在 Kanzi Studio 中修改着色器。请参阅 编辑着色器。

在您的 Kanzi 应用程序中使用着色器的最佳实践是:

  • 降低精度并从片段计算切换到顶点计算,从而优化片段着色器。请参阅 优化片段着色器。

  • 如果节点呈现的顺序需要在着色器程序之间过多切换,则渲染速度会减慢。请参阅 减少着色器切换。

  • 当用户在具有多核处理器的环境中运行您的 Kanzi 应用程序时,Kanzi 会自动使用多个 CPU 核心将 kzb 文件中的 GPU 资源加载到 RAM 中。

    Kanzi 使您能够配置应用程序要使用的核心数量。请参阅 并行加载资源。

  • 确保将着色器仅计算您使用的灯光数量。将应用程序中 Scene 节点的灯光数量限制为着色器计算的数量。

  • 使用着色器工具(例如 PVRShaderEditor)获取有关着色器性能成本的全面信息。

  • 确保您的着色器中没有出现任何错误或警告。

  • 将您要在多个着色器中使用的功能放入单独的着色器中,并重用该着色器代码。请参阅 重用着色器代码。要在不复制文件的情况下跨工程重用着色器代码,请使用 Kanzi 着色器包含库。请参阅 使用着色器包含库。

另请参阅

减少着色器切换

优化片段着色器

并行加载资源

设置 Kanzi Engine 如何处理未使用的资源

编辑着色器

使用 Sorting Filter 防止过度绘制。

排除应用程序性能问题