Unity3D Shader :水滴效果

Shader 代码

Shader "Unlit/Test"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MainColor("Color",COLOR)=(1,1,1,1)
}
CGINCLUDE
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float _distanceFactor;
uniform float _timeFactor;
uniform float _totaFactor;
uniform float _waveWidth;
uniform float _curwaveDistance;
float4 _MainColor;
fixed4 frag(v2f_img i):SV_Target
{
float2 dv=float2(0.5,0.5)-i.uv;


dv=dv*float2(_ScreenParams.x/_ScreenParams.y,1);
float dis=sqrt(dv.x*dv.x+dv.y*dv.y);


float sinFactor=sin(dis*_distanceFactor+_Time.y*_timeFactor)*_totaFactor*0.01;


float discardFactor=clamp(_waveWidth-abs(_curwaveDistance-dis),0,1);


float2 dv1=normalize(dv);
float2 off =dv1*sinFactor*discardFactor;
float2 uv=off+i.uv;
return tex2D(_MainTex,uv)*_MainColor.xyzw;
}
ENDCG
SubShader
{

Pass
{
ZTest Always
Cull Off
ZWrite Off
Fog{Mode off}


CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag

#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
}
FallBack off

}

C# 代码1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class PostEffectBase : MonoBehaviour {


    public Shader shader = null;
    Material _material = null;
    public Material _Material
    {
        get
        {
            if (_material == null)
            {
                _material = GetMaterial(shader);
            }
            return _material;
        }
    }
    Material GetMaterial(Shader shader)
    {
        if (shader == null)
            return null;
        if (shader.isSupported == false)
            return null;
        Material material = new Material(shader);
        material.hideFlags = HideFlags.DontSave;
        if (material)
            return material;
        return null;
    }

}

C# 代码2

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class ShuiDi : PostEffectBase {


    public float distanceFactor = 60f;


    public float timeFactor = -30f;


    public float totaFactor = 1.0f;


    public float waveWidth = 0.3f;


    public float waveSpeed = 0.3f;


    float waveStartTime;


    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        float curwaveDistance = (Time.time - waveStartTime) * waveSpeed;
        if (curwaveDistance >= 1.5)
        {
            waveStartTime = Time.time;
        }
        _Material.SetFloat("_distanceFactor", distanceFactor);
        _Material.SetFloat("_timeFactor", timeFactor);
        _Material.SetFloat("_totaFactor", totaFactor);
        _Material.SetFloat("_waveWidth", waveWidth);
        _Material.SetFloat("_curwaveDistance", curwaveDistance);


        Graphics.Blit(source, destination, _Material);
    }

}


猜你喜欢

转载自blog.csdn.net/weixin_42452001/article/details/80684201