3D美术实时渲染最佳实践(7):材质与Shader

2020/09 28 21:09

7.1 Shader和材质简介 – (略)

7.2 在移动平台上使用优化的Shader

Unity提供了一组Mobile的Shader,在移动平台上尽量使用它们

7.3 优化纹理

在移动平台上尽可能少用纹理,纹理采样会导致更高的带宽更大的功耗,影响设备的电池寿命。

可以考虑将多个纹理打包到一张纹理中,而不是将一个纹理用于粗糙度,一个纹理用于金属度。

纹理打包示例

7.4 对比光照Shader和无光照Shader

可以选择Lit 和 Unlit,当然Unlit的性能更好,也可以把阴影画在上面,此处略过

7.5 小心使用透明材质

尽可能使用不透明材质,在移动平台,除非必要,不要使用透明材质。

透明材质总是比不透明材质更消耗GPU,使用许多透明材质会影响性能,尤其是许多透明对象叠在一起时。当一个像素在屏幕上多次重复绘制,称为Overdraw。

对于移动平台,Overdraw严重影响性能。所以游戏场景内尽可能让Overdraw保持最小,在Unity中可以在Scene中打开Overdraw的观察模式:

7.7 分析和对比透明材质的实现方式

有2种实现透明材质的方法:AlphaBlend和AlphaTest

在移动平台上,可以使用ARM的Streamline来收集性能数据;

AlphaTest的材质要么100%透明要么100%不透明,可以设定阈值,在Unity中称为Cutout。
注:在Shader中cg对应的指令为clip(v);

AlphaBlend和AlphaTest

AlphaTest

如果想在游戏中使用AlphaTest,有以下建议:

1、最好别用AlphaTest,除非必需
2、AlphaTest意味着要么100%透明,要么100%不透明
3、注意:AlphaTest会禁用了GPU的优化特性,所以在移动平台上仔细测试它的性能,并且和AlphaBlend的性能做对比

AlphaBlend

如果想在游戏中使用AlphaBlend,有以下建议:

1、移动平台,Unity建议AlphaBlend替代AlphaTest(老刘:这个结论可能是错的),实际上,还得分析和对比两者的性能差异,因为它和渲染的内容相关
2、移动平台尽量不要用AlphaBlend
3、如果一定要用Alpha,让它的渲染面积尽可能小

在树叶上使用AlphaTest

在静态下,上图没啥问题,但是在运动时,使用AlphaBlend看起来是错的,树叶的 渲染次序是错的。而AlphaTest可以正确的处理次序,不过与AlphaBlend相比,它的边缘粗糙,有锯齿。一般来说AlphaTest表现上还是可以接受的,只要锯齿的边缘在运动中不那么明显,但是当叶子和树枝因为AlphaBlend而前后跳动时,这种表现就不行了。

7.7 更多好的材质和Shader实践

1、使用简单Shader
2、用Unity系统自带的粒子系统
3、减少Overdraw,减少粒子数量

分析Shader复杂性

数量多的纹理采样和AlphaBend及其它功能会让Shader更加复杂,影响渲染性能。建议经常剖析Shader。

ARM提供了一些工具,像Mail Offline Shader Compiler 和 Steamline。

使用这些工具可以了解更多GPU的工作内幕,当前也需要更高级的图形学知识。

将PS内容前置到VS中

因为通常像素比顶点要多,或者说PS比VS运行更频繁,将PS内容前置到VS中;
使用Varyings变量(即PS输出并插值后的数据),

但是得注意tiler防止它成为瓶颈(Tiler?),完成后还得进一步分析性能。

避免使用复杂的函数

像sin, pow, cos, divide, noise 函数性能较差,推荐基本操作像加法,乘法,速度较快;在老的像OpenGL2的设备上,尽量少用复杂的函数

经常剖析性能(略)