编写着色器时的性能提示
只计算您需要的内容;任何实际不需要的内容都可清除。例如,支持每个材质颜色以使着色器更加灵活易用固然很好,但如果总是将该颜色设置为白色,那么在屏幕渲染的每个顶点或像素执行的计算都是无用的。
另外需要注意的是计算频率。通常情况下,渲染的像素(像素着色器执行)个数要比渲染的顶点(顶点着色器执行)个数更多;而要渲染的顶点个数比要渲染的对象多。所以,一般来说,尽可能将计算从像素着色器移到顶点着色器,或者从着色器中完全移出,并在脚本中再次赋值。
较少通用的表面着色器
表面着色器非常适于编写与光照相互作用的着色器。但是,其默认选项是为“一般情况”设置的。在许多情况下,您可以对着色器进行调整,使其运行速度更快,或者至少使其更小:
使用视图方向(即高光)着色器的
approxview
指令采用逐顶点(而不是逐像素)的方式使视图方向规范化。这虽然是近似的方法,但常常取得较好的效果。用于高光 (Specular) 着色器类型的
halfasview
速度更快。半向量(光照方向和视图向量的中间)将按逐顶点进行计算并规范化。同时,光照函数已将半向量作为参数接收,而不是视图向量。noforwardadd
将使着色器在正向 (Forward) 渲染中仅完全支持一个方向灯。其余灯仍然可以作为逐顶点光源或球谐函数对对象产生影响。这有利于将着色器变小,并且即使存在多个光源,也可以确保它始终在一个通道中渲染。noambient
将在着色器中禁用环境光照和球谐函数光源。这可以使着色器稍微提速。
计算精度
使用 Cg/HLSL 写着色器时,主要有三种基本的数字类型:float
、half
和 fixed
(以及由它们的向量和矩阵变量,如 half3 和 float4x4):
float
:高精度浮点。一般为 32 位,正如正规编程语言中的浮点类型。half
:中等精度浮点。一般为 16 位,范围是 -60000 到 +60000,精度是 3.3 的十进制数字。fixed
:低精度浮点。一般为 11 位,范围是 -2.0 到 +2.0,精度是 1/256。
尽可能使用最低的精度,这对像 iOS 和 Android 一样的移动平台尤为重要。较好的经验法则是:
对于颜色和单位长度的向量,使用
fixed
.对于其他内容,如果范围和精度合适,使用
half
,否则使用float
t。
在移动平台上,关键是尽可能确保在片段着色器中保持较低精度。在大多数移动 GPU 上,在低精度 (fixed/lowp) 类型上应用拌合花费较高;同时,在 fixed/lowp 和高精度类型之间进行转换也是相当昂贵的。
Alpha 测试
固定函数 AlphaTest 或与其等同的可编程函数 clip()
在不同的平台上拥有不同的性能特点:
一般来说,在大多数平台上使用它来剔除完全透明的像素是一个小优势。
但是,在 iOS 上发现的 PowerVR GPU 以及某些 Android 设备中,alpha 测试比较昂贵。请勿尝试用作“性能优化”,因为它将变得更慢。
颜色遮蔽图
在某些平台(主要为 iOS 和 Android 设备上找到的移动 GPU)上,使用 ColorMask 删除某些通道(如 ColorMask RGB
) )会比较昂贵,因此,请在真正必要时才使用。