unity使用屏幕后处理实现闪烁特效,创建新的shader文件过程

shader代码

Shader "
FlickerEffect"
{
    Properties
    {
        _MainTex ("Texture(RGB)", 2D) = "white" {}
        _FlickerColor("FlickerColor",Color)=(1,1,1,1)
        _LerpLevel("LerpLevel",Range(0.0,1.0))=1.0
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag
            #include "UnityCG.cginc"
            uniform sampler2D _MainTex;
            half4 _FlickerColor;
            fixed _LerpLevel;
            half4 frag(v2f_img i):SV_Target
            {
               //如果纹理为null,就单独显示颜色
               half4 renderTex=tex2D(_MainTex,i.uv);
               //处理颜色,正常图层叠加  结果色=混合色 * 混合色不透明度值 + 基色 * (100% - 混合色不透明度值)。
               half r=_FlickerColor.r*_FlickerColor.a+renderTex.r*(1-_FlickerColor.a);
               half g=_FlickerColor.g*_FlickerColor.a+renderTex.g*(1-_FlickerColor.a);
               half b=_FlickerColor.b*_FlickerColor.a+renderTex.b*(1-_FlickerColor.a);
               half a= _FlickerColor.a+(1-_FlickerColor.a)*renderTex.a;

               half4 targetColor=half4(r,g,b,a);
               //lerp(x,y,s) return x+s(y-x)
               half4 finalColor=lerp(renderTex,targetColor,_LerpLevel);
               return finalColor;
            }
            ENDCG
        }
    }
}

实现屏幕后处理,调用OnRenderImage,使用shader

public Material material
    {
        get {
            if (curMaterial == null)
            {
                curMaterial = new Material(curShader);
                curMaterial.hideFlags = HideFlags.HideAndDontSave;
            }
            return curMaterial;
        }
    }

 void Start () {
    curShader = Shader.Find("ORG/FlickerEffect");
}

 void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        if (curShader != null)
        {
            material.SetFloat("_LerpLevel", lerpLevel);
            if (flickerTexture != null)
                material.SetTexture("MainTex", flickerTexture);
            material.SetColor("_FlickerColor", flickerColor);
            Graphics.Blit(source, destination, material);
        }
        else
        {
            Graphics.Blit(source, destination);
        }
    }

使用协程实现等待执行

IEnumerator ToFlicker()
    {
        while (true)
        {
            if (remainDuration < 1)
                break;
            remainDuration--;
            lerpLevel = remainDuration / duration;
            lerpLevel = Mathf.Clamp(lerpLevel, 0, 1f);
            yield return null;
        }
        Destroy(this);
    }

unity设置打包时包含shader文件

这里写图片描述

保存时对应的工程文件:

这里写图片描述

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值