zoukankan      html  css  js  c++  java
  • [UnityShader3]溶解与重现效果

    參考链接:http://www.cnblogs.com/Esfog/p/DissolveShader.html


    效果图:



    从颜色变化来说,有三种,一种是纹理颜色。一种是纹理与黑边的混合颜色,一种是透明(用discard处理。不绘制像素)。还须要一张纹理(随意),依据它的随意一个通道来控制哪部分先消失。比如上面的效果图用的就是这张纹理的r通道:


    假设用的是这张纹理(也就是模型自身的纹理)的r通道。会更加酷:





    溶解效果代码例如以下:

    Shader "Esfog/Dissolve" 
    {
        Properties 
        {
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _NoiseTex ("NoiseTex (R)",2D) = "white"{}
            _DissolveSpeed ("DissolveSpeed (Second)",Float) = 1
            _EdgeWidth("EdgeWidth",Range(0,0.5)) = 0.1
            _EdgeColor("EdgeColor",Color) =  (1,1,1,1)
            _StartTime("StartTime",Float) = 0
        }
        SubShader 
        {
            Tags { "RenderType"="Opaque" }
            
            Pass
            {
                CGPROGRAM
                #pragma vertex vert_img
                #pragma fragment frag
                #include "UnityCG.cginc"
                 
                uniform sampler2D _MainTex;
                uniform sampler2D _NoiseTex;
                uniform float _DissolveSpeed;
                uniform float _EdgeWidth;
                uniform float4 _EdgeColor;
                uniform float _StartTime;
                
                float4 frag(v2f_img i):COLOR
                {
                    float DissolveFactor = saturate((_Time.y - _StartTime) / _DissolveSpeed);
                    float noiseValue = tex2D(_NoiseTex,i.uv).r;            
                    if(noiseValue <= DissolveFactor)
                    {
                        discard;
                    }
                    
                    float4 texColor = tex2D(_MainTex,i.uv);
                    float EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor));
                    float4 BlendColor = texColor * _EdgeColor;
                                    
                    return lerp(texColor,BlendColor,1 - EdgeFactor);
                }
                
                ENDCG
            }
        } 
        
        FallBack Off
    }

    重现效果代码例如以下:

    Shader "lyh/Show" 
    {
        Properties 
        {
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _NoiseTex ("NoiseTex (R)",2D) = "white"{}
            _DissolveSpeed ("DissolveSpeed (Second)",Float) = 1
            _EdgeWidth("EdgeWidth",Range(0,0.5)) = 0.1
            _EdgeColor("EdgeColor",Color) =  (1,1,1,1)
            _StartTime("StartTime",Float) = 0
        }
        SubShader 
        {
            Tags { "RenderType"="Opaque" }
            
            Pass
            {
                CGPROGRAM
                #pragma vertex vert_img
                #pragma fragment frag
                #include "UnityCG.cginc"
                 
                uniform sampler2D _MainTex;
                uniform sampler2D _NoiseTex;
                uniform float _DissolveSpeed;
                uniform float _EdgeWidth;
                uniform float4 _EdgeColor;
                uniform float _StartTime;
    
                float4 frag(v2f_img i):COLOR
                {
                    float DissolveFactor = saturate((_Time.y - _StartTime) / _DissolveSpeed);
                    float noiseValue = tex2D(_NoiseTex,i.uv).r;            
                    
                    float4 texColor = tex2D(_MainTex,i.uv);
                    float EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor));
                    float4 BlendColor = texColor * _EdgeColor;
                    
                    clip(1 - EdgeFactor - 0.01);
                    return lerp(BlendColor,texColor,1 - EdgeFactor);
                }
                
                ENDCG
            }
        } 
        
        FallBack Off
    }

    在给出的參考链接中,能够非常好地了解到原理。这里就不解释了。而重现效果只是就是溶解效果的反转了。这里须要控制一下时间:

    material.SetFloat("_StartTime", Time.realtimeSinceStartup);

  • 相关阅读:
    AJAX局部刷新
    jquery 调用数据
    java 节点流(字符流,字节流)和包装流(缓冲流,转换流)
    java File类的使用以及一些函数
    java 自定义泛型
    java 注解
    jdbc baseDAO 以及 每个类的继承
    jdbc 事物 commit 和rollback方法
    jdbc 可处理数据库事物的通用增删查改函数
    jdbc 数据库批处理insert操作
  • 原文地址:https://www.cnblogs.com/llguanli/p/8568374.html
Copyright © 2011-2022 走看看