着色器最佳实践¶
在 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 特定的计算,包括使用物理基础光照模型应用光照,都是在片段着色器中完成的。这在许多光照条件下提供了更逼真的渲染效果。
根据图形硬件和场景的复杂性,着色器可能会对应用程序性能产生重大影响。
您可以通过降低着色器中 uniform 和 varying 特性的精度来优化性能。着色器中的精度特定于 GLES。
对于移动和嵌入式设备,使用:
所有范围为 [-2..2] 的变量精度较低。
对于不需要32位浮点全精度的其他变量,使用中等精度。
着色器是特定于材质的。您可以直接在 Kanzi Studio 中修改着色器。请参阅 编辑着色器。
在您的 Kanzi 应用程序中使用着色器的最佳实践是:
降低精度并从片段计算切换到顶点计算,从而优化片段着色器。请参阅 优化片段着色器。
如果节点呈现的顺序需要在着色器程序之间过多切换,则渲染速度会减慢。请参阅 减少着色器切换。
让 Kanzi Studio 编译代码并以二进制格式导出着色器。这样做可以减少应用程序的加载时间。请参阅 使用二进制着色器。
当用户在具有多核处理器的环境中运行您的 Kanzi 应用程序时,Kanzi 会自动使用多个 CPU 核心将 kzb 文件中的 GPU 资源加载到 RAM 中。
Kanzi 使您能够配置应用程序要使用的核心数量。请参阅 并行加载资源。
确保将着色器仅计算您使用的灯光数量。将应用程序中 Scene 节点的灯光数量限制为着色器计算的数量。
使用着色器工具(例如 PVRShaderEditor)获取有关着色器性能成本的全面信息。
确保您的着色器中没有出现任何错误或警告。
将您想在多个着色器中使用的功能放入单独的着色器中,并重用该着色器代码。请参阅 重用着色器代码。