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

查看:1250 |回复:8 | 2016-12-27 10:52:52

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

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();
  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();
  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    


    学习交流群:575561285

评分

参与人数 2元素币 +5 活跃度 +22 展开 理由
小月儿 + 2 + 12 看不懂
yoko + 3 + 10 总感觉有点6!虽然看不懂

查看全部评分

2016-12-27 10:52:52  
 赞 赞 0

使用道具 登录

8个回答,把该问题分享到群,邀请大神一起回答。
3#
不错
回复 收起回复
2016-12-28 08:28:58   回复
 赞 赞 0

使用道具 登录

4#
资源甚好,发帖艰辛,且阅且珍惜!
回复 收起回复
2016-12-28 08:49:31   回复
 赞 赞 0

使用道具 登录

5#
前排支持下分享
回复 收起回复
2016-12-28 22:04:48   回复
 赞 赞 0

使用道具 登录

6#
{:1_144:}
回复 收起回复
2016-12-28 22:04:53   回复
 赞 赞 0

使用道具 登录

7#
前排支持下分享
回复 收起回复
2016-12-28 22:05:16   回复
 赞 赞 0

使用道具 登录

8#
{:1_144:}
回复 收起回复
2016-12-28 22:05:21   回复
 赞 赞 0

使用道具 登录

9#
元素帖子强,满满正能量!
回复 收起回复
2016-12-29 11:45:41   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

Unity3D技术手机游戏引擎手游引擎
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表