开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1577

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1033|回复: 6

[海莉zhe] 【知识摘录】 Unity3D 实现涡纹旋花效果[Shader](一)

[复制链接]  [移动端链接]
排名
1443
昨日变化
4

29

主题

141

帖子

1509

积分

Rank: 9Rank: 9Rank: 9

UID
76890
好友
19
蛮牛币
2092
威望
0
注册时间
2015-3-4
在线时间
520 小时
最后登录
2017-2-23

专栏作家

发表于 2016-12-21 03:41:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 海莉zhe 于 2016-12-21 03:41 编辑

    今天小编为大家分享一下,如何写一个涡纹旋花效果的小Demo哈!
    1.新建一个unity3d 项目,新建一个CameraFilterPack_Vision_Psycho.shader文件。

         
[C#] 纯文本查看 复制代码
Shader "CameraFilterPack/Vision_Psycho" { 
Properties 
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_TimeX ("Time", Range(0.0, 1.0)) = 1.0
_ScreenResolution ("_ScreenResolution", Vector) = (0.,0.,0.,0.)
}
SubShader
{
Pass
{
ZTest Always
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma target 3.0
#pragma glsl
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float _TimeX;
uniform float _Value;
uniform float _Value2;
uniform float _Value3;
uniform float _Value4;
uniform float4 _ScreenResolution;
struct appdata_t
{
float4 vertex   : POSITION;
float4 color    : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
half2 texcoord  : TEXCOORD0;
float4 vertex   : SV_POSITION;
fixed4 color    : COLOR;
};
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color;
return OUT;
}
float4 frag (v2f i) : COLOR
{
float k=0.;
float2 uv=i.texcoord.xy;
float3 d =  float3(uv,1.0)/1.0-.5, o = d, c=k*d, p;
d += float3(tex2D(_MainTex, float2(0.1, 0.5)).rgb) * 0.01;
for( int i=0; i<12; i++ )
{
p = o+ cos(_TimeX);
for (int j = 0; j < 10; j++) 
p = abs(p.zyx-.2) -.7,k += exp(-2. * abs(dot(p,o)));
k/=3.;
o += d *.5*k;
c = .97*c + .1*k*float3(k*k*k*_Value3,k*k*_Value4,_Value4);
}
float dist2 = 1.0 - smoothstep(_Value,_Value-0.05-_Value2, length(float2(0.5,0.5) - uv));
c =  .4 *log(1.+c);
float2 cc= float2(c.r/2*uv.x,c.r/2*uv.y);
c +=tex2D(_MainTex, cc);
c=lerp(tex2D(_MainTex,uv),c,dist2);
return float4(c,1.0);
}
ENDCG
}
}
}

     
    2.shader完成后,我们需要考虑可以更改shader的一些参数,所以我们新建一个CameraFilterPack_Vision_Psycho.cs 组件类,方便使用。

         
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
[AddComponentMenu("Camera Filter Pack/Vision/Psycho")]
public class CameraFilterPack_Vision_Psycho : MonoBehaviour
{
    #region Variables
    public Shader SCShader;
    private float TimeX = 1.0f;
    private Vector4 ScreenResolution;
    private Material SCMaterial;
    [Range(0.01f, 1f)]
    public float HoleSize = 0.6f;
    [Range(-1f, 1f)]
    public float HoleSmooth = 0.3f;
    [Range(-2f, 2f)]
    public float Color1 = 0.2f;
    [Range(-2f, 2f)]
    public float Color2 = 0.9f;
    public static float ChangeValue;
    public static float ChangeValue2;
    public static float ChangeValue3;
    public static float ChangeValue4;
    #endregion
    #region Properties
    Material material
    {
        get
        {
            if (SCMaterial == null)
            {
                SCMaterial = new Material(SCShader);
                SCMaterial.hideFlags = HideFlags.HideAndDontSave;
            }
            return SCMaterial;
        }
    }
    #endregion
    void Start()
    {
        ChangeValue = HoleSize;
        ChangeValue2 = HoleSmooth;
        ChangeValue3 = Color1;
        ChangeValue4 = Color2;
        SCShader = Shader.Find("CameraFilterPack/Vision_Psycho");
        if (!SystemInfo.supportsImageEffects)
        {
            enabled = false;
            return;
        }
    }

    void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
    {
        if (SCShader != null)
        {
            TimeX += Time.deltaTime;
            if (TimeX > 100) TimeX = 0;
            material.SetFloat("_TimeX", TimeX);
            material.SetFloat("_Value", HoleSize);
            material.SetFloat("_Value2", HoleSmooth);
            material.SetFloat("_Value3", Color1);
            material.SetFloat("_Value4", Color2);
            material.SetVector("_ScreenResolution", new Vector4(sourceTexture.width, sourceTexture.height, 0.0f, 0.0f));
            Graphics.Blit(sourceTexture, destTexture, material);
        }
        else
        {
            Graphics.Blit(sourceTexture, destTexture);
        }
    }

    void OnValidate()
    {
        ChangeValue = HoleSize;
        ChangeValue2 = HoleSmooth;
        ChangeValue3 = Color1;
        ChangeValue4 = Color2;

    }
    void Update()
    {
        if (Application.isPlaying)
        {
            HoleSize = ChangeValue;
            HoleSmooth = ChangeValue2;
            Color1 = ChangeValue3;
            Color2 = ChangeValue4;
        }
#if UNITY_EDITOR
        if (Application.isPlaying != true)
        {
            SCShader = Shader.Find("CameraFilterPack/Vision_Psycho");
        }
#endif
    }
    void OnDisable()
    {
        if (SCMaterial)
        {
            DestroyImmediate(SCMaterial);
        }
    }
}

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

      
[C#] 纯文本查看 复制代码
using UnityEngine;

public class AddCameraFilter : MonoBehaviour {

    private CameraFilterPack_Vision_Psycho _cameraFilterPack;
    // Use this for initialization
    void Start () {
        _cameraFilterPack = GetComponent<CameraFilterPack_Vision_Psycho>();
    }
    
    // Update is called once per frame
    void OnGUI()
    {

        if (GUI.Button(new Rect(50, 200, 200, 30), "添加涡纹旋花效果"))
        {
            if(_cameraFilterPack==null)
                _cameraFilterPack= gameObject.AddComponent<CameraFilterPack_Vision_Psycho>();
            if (_cameraFilterPack != null)
                _cameraFilterPack.enabled = true;
        }
        if (GUI.Button(new Rect(50, 250, 200, 30), "移除涡纹旋花效果"))
        {
            if (_cameraFilterPack != null)
                _cameraFilterPack.enabled = false;
        }
    }
}


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

         4_0.png

         4_1.png
   
    学习交流群:575561285

评分

参与人数 1鲜花 +2 收起 理由
AnimeKing + 2 赞一个!

查看全部评分

本帖被以下淘专辑推荐:


回复

使用道具 举报

7日久生情
2971/5000
排名
74
昨日变化

2

主题

342

帖子

2971

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
3490
好友
4
蛮牛币
7237
威望
0
注册时间
2013-9-9
在线时间
731 小时
最后登录
2017-2-23

VIP

发表于 2016-12-21 09:36:07 | 显示全部楼层
66666666666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
950/1000
排名
5840
昨日变化
58

2

主题

571

帖子

950

积分

Rank: 5Rank: 5

UID
92518
好友
1
蛮牛币
1836
威望
0
注册时间
2015-4-15
在线时间
215 小时
最后登录
2017-2-23
发表于 2016-12-21 10:33:33 | 显示全部楼层
今天小编为大家分享一下,如何写一个涡纹旋花效果的小Demo哈!

回复 支持 反对

使用道具 举报

4四处流浪
312/500
排名
7002
昨日变化
4

0

主题

95

帖子

312

积分

Rank: 4

UID
160770
好友
6
蛮牛币
252
威望
0
注册时间
2016-8-5
在线时间
107 小时
最后登录
2017-2-23
发表于 2016-12-21 13:57:23 | 显示全部楼层
多谢分享。。。学习

回复

使用道具 举报

5熟悉之中
759/1000
排名
2139
昨日变化
8

0

主题

25

帖子

759

积分

Rank: 5Rank: 5

UID
145698
好友
0
蛮牛币
1232
威望
0
注册时间
2016-4-16
在线时间
288 小时
最后登录
2017-2-23
发表于 2016-12-21 15:19:37 | 显示全部楼层
给力!!!!!!!!!

回复

使用道具 举报

3偶尔光临
151/300
排名
15950
昨日变化
721

1

主题

53

帖子

151

积分

Rank: 3Rank: 3Rank: 3

UID
138025
好友
0
蛮牛币
188
威望
0
注册时间
2016-3-1
在线时间
73 小时
最后登录
2017-2-22
发表于 2017-1-5 10:10:23 | 显示全部楼层
使用的是什么unity版本?

回复 支持 反对

使用道具 举报

排名
14321
昨日变化
14

1

主题

31

帖子

83

积分

Rank: 2Rank: 2

UID
188442
好友
0
蛮牛币
180
威望
0
注册时间
2016-12-1
在线时间
27 小时
最后登录
2017-2-17
发表于 7 天前 | 显示全部楼层
MAKR一下

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

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