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