Unity Shader优化教程详解

5月份的时候参加了Unite北京的开发者大会,这里来分享一下,外面都可以查到的优化方法不包括在这篇文章里。PPt不是特别全,但是主要内容都有了,所以这边我就来说一下。


对了,顺便推广一波,我要开始准备开课了,我是主要讲特效实现和SF SG ASE那块,大家记得关注一波

给链接:https://connect.unity.com/g/5afaa37832b3060028b19178?tab=discussion   (unity的社区,不用担心有毒)


这里主要说Vert frag shader 和surface shader的优化,不讲computeShader的内容。有关computerShader内容大家自行查unity官方的API。

首先说的是[Gamma][Linear]在不同空间时的区别

在Gamma颜色空间下,[Gamma][Linear]是没有区别的,所以指定无效

而在linear空间下,[Gamma][Linear]之间unity会做一个自动的转换。会将gamma标签进行一个计算,如果此时它的颜色是白色,那么转换后将为灰色一个非1的值。(这里我应该没记错是gamma吧,懒得开unity验证,有错大佬指出)。如果想节省部分开销可以标明空间减少转换的运算

就是下图



接下来需要说的是[NoScaleOffset]这个texture的标签

它的作用是用来隐藏贴图印射的缩放和偏移计算,代码依然可以操作

【凯爷的测试结果】



牙神告诉我的:你用图集的时候需要传输数据啊,spriterenderer帮你传了。不然你要控制tilling offset就合并不了了,只有自己写uv了,引擎底层的优化



[PerRendererDate]  

 这个属性需要从MaterialPropertyBlock里获取,不从material里得到 。如果不加这个属性,unity会自己偷偷创建一个新材质渲染相同效果。


Tags部分

DisableBatching 取消Batch,开启后将关闭自动合批。关闭合批就无法进行批处理,所以尽量不关闭。




ForceNoShadowCasting

true表示不受其它物体投掷阴影影响 

false表示受别物体投掷阴影影响



GrabPass 如果在不定义名字的情况下,将会自动定义,这部分操作也是额外的计算量,所以推荐直接定义好,如ppt第二部分那样。



Render State下面说的比较清楚,要注意的是,很多时候这个判断是无效的。得减少这种情况发生。




下面是说不建议使用Alpha testing ,不过这基本不现实,透明总是要用的。



surface shader 的优化,因为本人并不喜欢用它,一提它就想起去年优化布料系统效果的时候,都是泪,这部分大家自己看。




下面是重头戏,变体优化部分。


通常代码的写法,如下。

通常有2种写法,这里要科普下这两种的区别。

第一种

#pragma multi_compile __R
#pragma multi_compile __G
#pragma multi_compile __B

这种写法是消耗十分大的一种写法,它将生成所有组合类的变体,就是2*2*2种,这极大的增加了负担。


第二种

#pragma shader_featre __R
#pragma shader_featre __G
#pragma shader_featre __B

这种写法通常只生成自己,但是实际上容易不生成变体。需要进行处理,下面会说怎么处理。所以建议使用此类方法。

今天先打这么多吧,后面有缘再写。对了还要写后处理优化呢,我还欠着。




























0000




猜你喜欢

转载自blog.csdn.net/u011369981/article/details/80427770