着色器最佳实践

在 OpenGL ES 2.0 及更高版本中,当可编程管线可用时,您的应用程序会花费大量时间执行着色器程序。特别是在移动和嵌入式硬件上,着色器可能是许多问题的根源,包括性能瓶颈和图形伪影。正确使用时,着色器可以通过在 CPU 和 GPU 之间分配计算来帮助您实现惊人的图形质量和性能。您必须决定是在片段着色器还是顶点着色器中执行计算。

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

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

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

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

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

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

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

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

  • High performance vertex shaders 模板适用于低精度和高性能的 OpenGL ES2 应用程序。它包含针对 OpenGL ES2 优化的基于顶点的着色器。大多数 GPU 特定的计算,包括使用 Phong 反射模型应用光照,都是在顶点着色器中完成的。这是大多数设备的良好起点。

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

  • High quality fragment shaders 模板适用于高精度 OpenGL ES2 应用程序。它包含基于像素着色器的材料,用于 OpenGL ES2。大多数 GPU 特定的计算,包括使用 Phong 反射模型应用光照,都是在片段着色器中完成的。这通常以性能为代价提供更好的图像质量。

  • Physically based rendering 模板适用于 OpenGL ES3 应用程序。它包含基于实现物理基础渲染 (PBR) 原理的着色器的材质。这些材质的属性代表物理属性,例如金属度,因此易于控制。大多数 GPU 特定的计算,包括使用物理基础光照模型应用光照,都是在片段着色器中完成的。这在许多光照条件下提供了更逼真的渲染效果。

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

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

您可以通过降低着色器中 uniform 和 varying 特性的精度来优化性能。着色器中的精度特定于 GLES。

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

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

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

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

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

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

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

  • 让 Kanzi Studio 编译代码并以二进制格式导出着色器。这样做可以减少应用程序的加载时间。请参阅 使用二进制着色器。

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

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

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

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

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

  • 将您想在多个着色器中使用的功能放入单独的着色器中,并重用该着色器代码。请参阅 重用着色器代码。

另请参阅

减少着色器切换

使用二进制着色器

优化片段着色器

并行加载资源

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

编辑着色器

使用 Sorting Filter 防止过度绘制。

排除应用程序性能问题