码迷,mamicode.com
首页 > 其他好文 > 详细

屏幕水纹特效

时间:2017-11-21 18:49:00      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:blog   gif   ext   mat   immediate   脚本   end   matrix   offset   

效果:

技术分享图片

shader:

Shader "Unlit/Spread"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _R("Radius", Range(0,2)) = 0.2
        _Width("Width", Range(0,1)) = 0.2
        _Intension("Intension", Range(0,1)) = 0.025
    }
    SubShader
    {
        Tags 
        { 
        "RenderType"="Opaque"
        "IgnoreProjector" = "Opaque"
        }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            half _R;
            half _Width;
            half _Intension;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                half2 coords = i.uv;
                coords = (coords - 0.5) * 2;
                float r = coords.x *  coords.x + coords.y* coords.y;
                if (r < _R*_R && r >(_R - _Width)*(_R - _Width))
                {
                    half2 offsets = _Intension * coords;//光波越外越明显(偏移越大)
                    return tex2D(_MainTex, i.uv - offsets);
                }
                else
                {
                    return tex2D(_MainTex, i.uv);
                }
            }
            ENDCG
        }
    }
}

挂Camera的脚本:

using UnityEngine;
using System.Collections;

public class Spread : MonoBehaviour {

    public AnimationCurve V_Curve;
    public float V_SpreadSeconds = 2f;
    public float V_SpreadMaxRadius = 2f;

    float m_Radius = 0f;
    float m_CurveTime = 0f;
    Material spreaMaterial;
    Shader spreadShader;

    // Use this for initialization
    void Start () {
        spreadShader = Shader.Find("Unlit/Spread");
        spreaMaterial = new Material(spreadShader);
    }

    private void OnDestroy()
    {
        if (spreadShader != null) DestroyImmediate(spreadShader);
        if (spreaMaterial != null) DestroyImmediate(spreaMaterial);
    }

    private void OnEnable()
    {
        m_CurveTime = 0;
    }
    // Update is called once per frame
    void Update () {
        if (m_CurveTime <= V_SpreadSeconds)
        {
            float rate = m_CurveTime / V_SpreadSeconds;
            m_Radius = V_Curve.Evaluate(rate)* V_SpreadMaxRadius;
            m_CurveTime += Time.deltaTime;
        }
    }

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        spreaMaterial.SetFloat("_R", m_Radius);
        Graphics.Blit(source, destination, spreaMaterial);
    }
}

脚本没什么可说的,shader主要思想是向内采样。

屏幕水纹特效

标签:blog   gif   ext   mat   immediate   脚本   end   matrix   offset   

原文地址:http://www.cnblogs.com/Tearix/p/7867625.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!