Unity中Shader优化通用规则


前言

Unity中Shader优化通用规则


一、精度优化

1、三种精度 fixed / half / float

2、位置坐标、物理坐标类使用float

3、HDR颜色、方向向量类使用half

4、普通纹理、颜色类使用 fixed

5、实际上,使用的精度取决于 平台 和 GPU

6、现在桌面级GPU都是直接采用 float , Shader中的 fixed / half / float最后都是用的 float

7、现代移动端GPU大多仅支持 half 与 float ,所以能用 half 的就用 half

8、fiixed 仅用于较旧的移动 GPU


二、能放顶点着色器的不要放片段着色器中

在这里插入图片描述


三、多Pass少用

一个SubShader内如果含有多个Pass(不包含Unity中特殊使用的),则会渲染多次,同时将不能进行合批


四、小心使用 AlphaTest 和 ColorMask

AlphaTest :透明测试

  • 就是实现消融效果使用的 Clip() 函数。通常在大多数平台上使用 AlphaTest 会有一些性能优势,但是在 IOS 和某些使用 PowerVR GPU 的 Android 设备性能就很低

但是,使用 AlphaTest 是避免不了的。
因为,有很多地方用到 : 树叶透光、草地、网格围栏、渔网袜效果等。不可能通过建模来实现,因为比较消耗性能

ColorMask : 输出颜色通道

  • 在 IOS 和部分 Android 设备上同样性能很低

五、NoScaleOffset :不开启 Tilling 和 Offset面板

[NoScaleOffset][Normal]_NormalTex(“NormalTex”,2D) = “bump” {}

  • 在不需要调节 Tilling 和 Offset 的贴图属性中加入[NoScaleOffset],同时Shader不做相关计算

六、DisableBatching :不动态合批

Tags{“DisableBatching” = “true”}

  • true表示不进行合批
  • false表示能合批就尽量合批,默认值

同时影响 动态合批 与 静态合批
如果顶点上的计算需要在模型的本地空间下进行,则需要开启,否则最好不要开启

Unity中合批分为静态合批 和 动态合批

动态合批:

  • 我们创建两个立方体(赋予同一个材质球)用于测试

  • 在Frame Debugger界面,查看渲染效果

在这里插入图片描述

  • 创建一个Shader并且赋予一个材质

//在Tags{}中添加 DisableBatching 的设置
Tags { “RenderType”=“Opaque” “DisableBatching” = “false”}

  • 运行游戏渲染时,使用同一Shader材质的两个物体,并且没有关闭合批,则会在同一批次渲染

在这里插入图片描述

  • 若开启不动态合批的话,这两个物体会分两次渲染。

//在Tags{}中添加 DisableBatching 的设置
Tags { “RenderType”=“Opaque” “DisableBatching” = “true”}

在这里插入图片描述

  • 并且会在后渲染的物体中,告诉你,不动态合批的原因

在这里插入图片描述

静态合批:

在没运行时,重复上面步骤,就可以看出


七、GrabPass 抓取屏幕

  • GrabPass一般来说,能不用就不用,一般只用在 水扭曲 和 特效扭曲

1、方式一:

  • 若不定义名称则使用Unity默认的贴图名
  • GrabPass如果不指定贴图的名称,则每个对象的GrabPass都会每帧生成一次

GrabPass{}
sampler2D _GrabTexture;

2、方式二:

  • 若定义名称则使用自己定义的贴图名
  • GrabPass如果指定贴图的名称,则所有对象的GrabPass在一帧内只会生成一次

GrabPass{“_GrabTex”}
sampler2D _GrabTex;


八、Surface Shader :表面着色器

Surface Shader 是Unity提供给一些不是专门写Shader的人使用的,有很多的Bug

能不用就不用 Surface Shader(表面着色器)尽量使用 vertex / fragment(顶点片元着色器)


九、ShaderLOD :配置分级

LOD 600

  • 利用ShaderLOD来实现高中低配硬件的区分

十、Overdraw :同一个像素被渲染多次

  • 优化时,可以尽量减少半透明区域、可以减少特效层数、面积

//可以在Shader中使用这个标签来查看 Overdraw 高不高
Tags{“RenderType” = “Transparent”}

RenderType
用来区别这个Shader要渲染的对象是属于什么类别的,你可以想像成是我们把各种不同的物体按我们需要的类型来进行分类一样。
当然你也可以根据需要改成自定义的名称,这样并不会影响到Shader的效果。
此Tag多用于摄像机的替换材质功能(Camera.SetReplacementShader)。

  • 开启后,在Unity编辑界面开启Overdraw即可可见 Overdraw 层数(越亮层数越高)

在这里插入图片描述

在这里插入图片描述


十一、变体优化

  • 变体的数量直接影响 shaderlab 的内存占用,能少则少。

  • 尽量不要去用内置的Standard材质,会生成大量的变体,可以自己修改定制一个

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠溪泽岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值