unity里面动态的替换shader

来源:互联网 发布:程序员的数学全套pdf 编辑:程序博客网 时间:2024/06/07 00:02

原地址:http://blog.csdn.net/huutu/article/details/38231061?utm_source=tuicool&utm_medium=referral

在游戏中,怪物或者人受到攻击后,会有变白的效果。这个效果是Shader实现的。在判定被攻击的时候切换Shader。

[csharp] view plain copy
  1. Shader shader = getBeAttackShader();  
  2. material.shader = shader;  

[csharp] view plain copy
  1. static Shader s_BeattackShader = null;  
  2. protected virtual Shader getBeAttackShader()  
  3. {  
  4.     if(s_BeattackShader == null)  
  5.     {  
  6.         s_BeattackShader = Shader.Find("Custom/attack");  
  7.     }  
  8.     return s_BeattackShader;  
  9. }  

代码没有问题,但是在4S等低端设备上,被攻击时会明显卡顿,时间长达1S。

于是用Unity的性能分析器,在被攻击时暂停,可以看到:


在OpenGL中用过Shader的同学们看到下面的函数名字就知道问题所在了 

Shader.CreateGPUProgram()

这个函数过程就是创建GLProgram链接Shader的一个过程,在Unity3d中的Shader.Find()是直接创建GLProgram的。

如果是自己去写引擎,GLProgram一般在初始化的时候就会创建完毕,然后用类似GLProgramManager管理。

Unity中的问题我们也可以用这个方法解决,但是Unity提供了简便方法。


点击Editor - Project Setting - Graphics 


右侧 Always Included Shaders,把我们需要使用的Shader拖到里面去吧


0 0
原创粉丝点击