前言
最近有人问到写Shader需要注意哪些地方及如何优化,正好笔者也在研究这方面,这里主要针对Unity来说,其它平台或引擎也可以参考,本文主要分如下几个方面来说:Shader的选择,属性和状态的设置,数据类型选择,代码编写,举例,调试
Unity中Shader的选择
Unity中现在可以新建4种Shader,分别是Standard Surface Shader,Unlit Shader,Image Effect Shader,Compute Shader.
- Standard Surface Shader: 主要用于光照,Unity封装好了许多光照模型,如果项目中需要比较多的光照,可以选用这个类型的Shader
- Unlit Shader:就是普通的Vertex&Fragment Shader,可以用CG语言来写,这种Shader封装的比较少,效果,光照都要自己码代码。
- Image Effect Shader:主要用于后期处理,和Unlit Shader一样,唯一有点区别的是,关闭了Cull,ZWrite,打开了ZTest。
- Compute Shader:这个主要是GPU计算,这个不太熟悉,也就不探讨这个了。
笔记的建议是尽量用Unlit Shader来写,一方面封装的少,可以更深入了解底层,一方面可以自己动手实现任何想要的效果。也没有引入好多光照方面的变量,效率上会比Surface Shader高
如果想省时间,又不想了解光照具体实现的,Surface Shader可以帮你快速实现效果。
属性和状态的设置
- 大部分shader都有_Color属性,但如果你并没有使用,那么就应该去掉,避免无谓的计算,其它的自动生成的属性或无用的属性也都应该去掉。
- Alpha Test,Cull,Zwrite,ZTest等能关的都关掉,需要时再打开。
- 排除延迟渲染的pass(通道)
- 关闭渲染附加通道&#x