查看: 361|回复: 3
收起左侧

[Unity 3D] Unity3D 实现涡纹旋花效果[Shader](一)

[复制链接]
发表于 2016-12-27 11:20:52 | 显示全部楼层 |阅读模式
  分享QQ空间赚Top卷,好友点击你的分享进入网站,系统自动奖励你 5 个Top卷   点击我 赚Top卷!   奖励排行榜

游戏引擎
文件风格:: -
软件版本:: 5.X
文件大小:: 1 MB

马上注册,下载海量CG资源,结交各路大神,加入CG拓扑网!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
    今天为大家分享一下,如何写一个涡纹旋花效果的小Demo哈!

    1.新建一个Unity3d 项目,新建一个CameraFilterPack_Vision_Psycho.shader文件。
     
  1. ///////////////////////////////////////////
  2. //  CameraFilterPack v2.0 - by VETASOFT 2015 ///
  3. ///////////////////////////////////////////


  4. Shader "CameraFilterPack/Vision_Psycho" {
  5. Properties
  6. {
  7. _MainTex ("Base (RGB)", 2D) = "white" {}
  8. _TimeX ("Time", Range(0.0, 1.0)) = 1.0
  9. _ScreenResolution ("_ScreenResolution", Vector) = (0.,0.,0.,0.)
  10. }
  11. SubShader
  12. {
  13. Pass
  14. {
  15. ZTest Always
  16. CGPROGRAM
  17. #pragma vertex vert
  18. #pragma fragment frag
  19. #pragma fragmentoption ARB_precision_hint_fastest
  20. #pragma target 3.0
  21. #pragma glsl
  22. #include "UnityCG.cginc"
  23. uniform sampler2D _MainTex;
  24. uniform float _TimeX;
  25. uniform float _Value;
  26. uniform float _Value2;
  27. uniform float _Value3;
  28. uniform float _Value4;
  29. uniform float4 _ScreenResolution;
  30. struct appdata_t
  31. {
  32. float4 vertex   : POSITION;
  33. float4 color    : COLOR;
  34. float2 texcoord : TEXCOORD0;
  35. };
  36. struct v2f
  37. {
  38. half2 texcoord  : TEXCOORD0;
  39. float4 vertex   : SV_POSITION;
  40. fixed4 color    : COLOR;
  41. };
  42. v2f vert(appdata_t IN)
  43. {
  44. v2f OUT;
  45. OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
  46. OUT.texcoord = IN.texcoord;
  47. OUT.color = IN.color;
  48. return OUT;
  49. }
  50. float4 frag (v2f i) : COLOR
  51. {
  52. float k=0.;
  53. float2 uv=i.texcoord.xy;
  54. float3 d =  float3(uv,1.0)/1.0-.5, o = d, c=k*d, p;
  55. d += float3(tex2D(_MainTex, float2(0.1, 0.5)).rgb) * 0.01;
  56. for( int i=0; i<12; i++ )
  57. {
  58. p = o+ cos(_TimeX);
  59. for (int j = 0; j < 10; j++)
  60. p = abs(p.zyx-.2) -.7,k += exp(-2. * abs(dot(p,o)));
  61. k/=3.;
  62. o += d *.5*k;
  63. c = .97*c + .1*k*float3(k*k*k*_Value3,k*k*_Value4,_Value4);
  64. }
  65. float dist2 = 1.0 - smoothstep(_Value,_Value-0.05-_Value2, length(float2(0.5,0.5) - uv));
  66. c =  .4 *log(1.+c);
  67. float2 cc= float2(c.r/2*uv.x,c.r/2*uv.y);
  68. c +=tex2D(_MainTex, cc);
  69. c=lerp(tex2D(_MainTex,uv),c,dist2);
  70. return float4(c,1.0);
  71. }
  72. ENDCG
  73. }
  74. }
  75. }
复制代码


    2.shader完成后,我们需要考虑可以更改shader的一些参数,所以我们新建一个CameraFilterPack_Vision_Psycho.cs 组件类,方便使用。
  1. ///////////////////////////////////////////
  2. //  CameraFilterPack v2.0 - by VETASOFT 2015 ///
  3. ///////////////////////////////////////////
  4. using UnityEngine;
  5. using System.Collections;
  6. [ExecuteInEditMode]
  7. [AddComponentMenu("Camera Filter Pack/Vision/Psycho")]
  8. public class CameraFilterPack_Vision_Psycho : MonoBehaviour
  9. {
  10.     #region Variables
  11.     public Shader SCShader;
  12.     private float TimeX = 1.0f;
  13.     private Vector4 ScreenResolution;
  14.     private Material SCMaterial;
  15.     [Range(0.01f, 1f)]
  16.     public float HoleSize = 0.6f;
  17.     [Range(-1f, 1f)]
  18.     public float HoleSmooth = 0.3f;
  19.     [Range(-2f, 2f)]
  20.     public float Color1 = 0.2f;
  21.     [Range(-2f, 2f)]
  22.     public float Color2 = 0.9f;
  23.     public static float ChangeValue;
  24.     public static float ChangeValue2;
  25.     public static float ChangeValue3;
  26.     public static float ChangeValue4;
  27.     #endregion
  28.     #region Properties
  29.     Material material
  30.     {
  31.         get
  32.         {
  33.             if (SCMaterial == null)
  34.             {
  35.                 SCMaterial = new Material(SCShader);
  36.                 SCMaterial.hideFlags = HideFlags.HideAndDontSave;
  37.             }
  38.             return SCMaterial;
  39.         }
  40.     }
  41.     #endregion
  42.     void Start()
  43.     {
  44.         ChangeValue = HoleSize;
  45.         ChangeValue2 = HoleSmooth;
  46.         ChangeValue3 = Color1;
  47.         ChangeValue4 = Color2;
  48.         SCShader = Shader.Find("CameraFilterPack/Vision_Psycho");
  49.         if (!SystemInfo.supportsImageEffects)
  50.         {
  51.             enabled = false;
  52.             return;
  53.         }
  54.     }

  55.     void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
  56.     {
  57.         if (SCShader != null)
  58.         {
  59.             TimeX += Time.deltaTime;
  60.             if (TimeX > 100) TimeX = 0;
  61.             material.SetFloat("_TimeX", TimeX);
  62.             material.SetFloat("_Value", HoleSize);
  63.             material.SetFloat("_Value2", HoleSmooth);
  64.             material.SetFloat("_Value3", Color1);
  65.             material.SetFloat("_Value4", Color2);
  66.             material.SetVector("_ScreenResolution", new Vector4(sourceTexture.width, sourceTexture.height, 0.0f, 0.0f));
  67.             Graphics.Blit(sourceTexture, destTexture, material);
  68.         }
  69.         else
  70.         {
  71.             Graphics.Blit(sourceTexture, destTexture);
  72.         }
  73.     }

  74.     void OnValidate()
  75.     {
  76.         ChangeValue = HoleSize;
  77.         ChangeValue2 = HoleSmooth;
  78.         ChangeValue3 = Color1;
  79.         ChangeValue4 = Color2;

  80.     }
  81.     void Update()
  82.     {
  83.         if (Application.isPlaying)
  84.         {
  85.             HoleSize = ChangeValue;
  86.             HoleSmooth = ChangeValue2;
  87.             Color1 = ChangeValue3;
  88.             Color2 = ChangeValue4;
  89.         }
  90. #if UNITY_EDITOR
  91.         if (Application.isPlaying != true)
  92.         {
  93.             SCShader = Shader.Find("CameraFilterPack/Vision_Psycho");
  94.         }
  95. #endif
  96.     }
  97.     void OnDisable()
  98.     {
  99.         if (SCMaterial)
  100.         {
  101.             DestroyImmediate(SCMaterial);
  102.         }
  103.     }
  104. }
复制代码


    3.我们通过点击屏幕按钮添加特效文件,所以在摄像机上附加AddCameraFilter.cs组件。
  1. using UnityEngine;
  2. using System.Collections;

  3. public class AddCameraFilter : MonoBehaviour {

  4.     private CameraFilterPack_Vision_Psycho _cameraFilterPack;
  5.     // Use this for initialization
  6.     void Start () {
  7.         _cameraFilterPack = GetComponent<CameraFilterPack_Vision_Psycho>();
  8.     }
  9.    
  10.     // Update is called once per frame
  11.     void OnGUI()
  12.     {

  13.         if (GUI.Button(new Rect(50, 200, 200, 30), "添加涡纹旋花效果"))
  14.         {
  15.             if(_cameraFilterPack==null)
  16.                 _cameraFilterPack= gameObject.AddComponent<CameraFilterPack_Vision_Psycho>();
  17.             if (_cameraFilterPack != null)
  18.                 _cameraFilterPack.enabled = true;
  19.         }
  20.         if (GUI.Button(new Rect(50, 250, 200, 30), "移除涡纹旋花效果"))
  21.         {
  22.             if (_cameraFilterPack != null)
  23.                 _cameraFilterPack.enabled = false;
  24.         }
  25.     }
  26. }
复制代码
3.png

    4.好吧!最后我们直接运行项目看效果啦!
4_0.png

4_1.png
    学习交流群:575561285
精品推广排行榜:



上一篇:Unity3D 贪食蛇小游戏Demo[3D版]-准备工作(一)
下一篇:一套源码,分享给大家学习
回复

举报

发表于 2017-4-15 14:47:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2017-4-20 21:45:56 | 显示全部楼层
太棒了,感谢楼主无私的分享与奉献
发表于 3 天前 | 显示全部楼层
游戏资源发布哪家强?CG拓扑网最专业!
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Hottest最热帖子

快速回复 返回列表 客服中心 搜索 官方QQ群

Copyright   ©2011-2016  CGtop.com  Powered by©CG拓扑网  :     ( 蜀ICP备14022215号 )