溶解与重现

<div id="article_content" class="article_content">

<p>参考链接:http://www.cnblogs.com/Esfog/p/DissolveShader.html</p>
<p><br>
</p>
<p>效果图:</p>
<p><img src="https://img-blog.csdn.net/20150610131745834" alt=""><br>
</p>
<p><br>
</p>
<p>从颜色变化来说,有三种,一种是纹理颜色,一种是纹理与黑边的混合颜色,一种是透明(用discard处理,不绘制像素)。还需要一张纹理(任意),根据它的任意一个通道来控制哪部分先消失。例如上面的效果图用的就是这张纹理的r通道:</p>
<p><img src="https://img-blog.csdn.net/20150610132712297" alt=""><br>
</p>
<p>如果用的是这张纹理(也就是模型自身的纹理)的r通道,会更加酷:</p>
<p><img src="https://img-blog.csdn.net/20150610132733020" alt=""><br>
</p>
<p><br>
</p>
<p><img src="https://img-blog.csdn.net/20150610133211838" alt=""><br>
</p>
<p><br>
</p>
<p>溶解效果代码如下:</p>
<p></p>
<div class="dp-highlighter bg_csharp"><div class="bar"><div class="tools"><b>[csharp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 734px; top: 2601px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/1693878" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/1693878/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-c"><li class="alt"><span><span>Shader </span><span class="string">"Esfog/Dissolve"</span><span>   </span></span></li><li class=""><span>{  </span></li><li class="alt"><span>    Properties   </span></li><li class=""><span>    {  </span></li><li class="alt"><span>        _MainTex (<span class="string">"Base (RGB)"</span><span>, 2D) = </span><span class="string">"white"</span><span> {}  </span></span></li><li class=""><span>        _NoiseTex (<span class="string">"NoiseTex (R)"</span><span>,2D) = </span><span class="string">"white"</span><span>{}  </span></span></li><li class="alt"><span>        _DissolveSpeed (<span class="string">"DissolveSpeed (Second)"</span><span>,Float) = 1  </span></span></li><li class=""><span>        _EdgeWidth(<span class="string">"EdgeWidth"</span><span>,Range(0,0.5)) = 0.1  </span></span></li><li class="alt"><span>        _EdgeColor(<span class="string">"EdgeColor"</span><span>,Color) =  (1,1,1,1)  </span></span></li><li class=""><span>        _StartTime(<span class="string">"StartTime"</span><span>,Float) = 0  </span></span></li><li class="alt"><span>    }  </span></li><li class=""><span>    SubShader   </span></li><li class="alt"><span>    {  </span></li><li class=""><span>        Tags { <span class="string">"RenderType"</span><span>=</span><span class="string">"Opaque"</span><span> }  </span></span></li><li class="alt"><span>          </span></li><li class=""><span>        Pass  </span></li><li class="alt"><span>        {  </span></li><li class=""><span>            CGPROGRAM  </span></li><li class="alt"><span><span class="preprocessor">            #pragma vertex vert_img</span><span>  </span></span></li><li class=""><span><span class="preprocessor">            #pragma fragment frag</span><span>  </span></span></li><li class="alt"><span><span class="preprocessor">            #include "UnityCG.cginc"</span><span>  </span></span></li><li class=""><span>               </span></li><li class="alt"><span>            uniform sampler2D _MainTex;  </span></li><li class=""><span>            uniform sampler2D _NoiseTex;  </span></li><li class="alt"><span>            uniform <span class="keyword">float</span><span> _DissolveSpeed;  </span></span></li><li class=""><span>            uniform <span class="keyword">float</span><span> _EdgeWidth;  </span></span></li><li class="alt"><span>            uniform float4 _EdgeColor;  </span></li><li class=""><span>            uniform <span class="keyword">float</span><span> _StartTime;  </span></span></li><li class="alt"><span>              </span></li><li class=""><span>            float4 frag(v2f_img i):COLOR  </span></li><li class="alt"><span>            {  </span></li><li class=""><span>                <span class="keyword">float</span><span> DissolveFactor = saturate((_Time.y - _StartTime) / _DissolveSpeed);  </span></span></li><li class="alt"><span>                <span class="keyword">float</span><span> noiseValue = tex2D(_NoiseTex,i.uv).r;              </span></span></li><li class=""><span>                <span class="keyword">if</span><span>(noiseValue <= DissolveFactor)  </span></span></li><li class="alt"><span>                {  </span></li><li class=""><span>                    discard;  </span></li><li class="alt"><span>                }  </span></li><li class=""><span>                  </span></li><li class="alt"><span>                float4 texColor = tex2D(_MainTex,i.uv);  </span></li><li class=""><span>                <span class="keyword">float</span><span> EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor));  </span></span></li><li class="alt"><span>                float4 BlendColor = texColor * _EdgeColor;  </span></li><li class=""><span>                                  </span></li><li class="alt"><span>                <span class="keyword">return</span><span> lerp(texColor,BlendColor,1 - EdgeFactor);  </span></span></li><li class=""><span>            }  </span></li><li class="alt"><span>              </span></li><li class=""><span>            ENDCG  </span></li><li class="alt"><span>        }  </span></li><li class=""><span>    }   </span></li><li class="alt"><span>      </span></li><li class=""><span>    FallBack Off  </span></li><li class="alt"><span>}  </span></li></ol></div><pre code_snippet_id="1693878" snippet_file_name="blog_20160523_1_7335827" name="code" class="csharp" style="display: none;">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
}</pre><br>
重现效果代码如下:<br>
<p></p>
<p></p>
<div class="dp-highlighter bg_csharp"><div class="bar"><div class="tools"><b>[csharp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 734px; top: 3640px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/1693878" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/1693878/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-c"><li class="alt"><span><span>Shader </span><span class="string">"lyh/Show"</span><span>   </span></span></li><li class=""><span>{  </span></li><li class="alt"><span>    Properties   </span></li><li class=""><span>    {  </span></li><li class="alt"><span>        _MainTex (<span class="string">"Base (RGB)"</span><span>, 2D) = </span><span class="string">"white"</span><span> {}  </span></span></li><li class=""><span>        _NoiseTex (<span class="string">"NoiseTex (R)"</span><span>,2D) = </span><span class="string">"white"</span><span>{}  </span></span></li><li class="alt"><span>        _DissolveSpeed (<span class="string">"DissolveSpeed (Second)"</span><span>,Float) = 1  </span></span></li><li class=""><span>        _EdgeWidth(<span class="string">"EdgeWidth"</span><span>,Range(0,0.5)) = 0.1  </span></span></li><li class="alt"><span>        _EdgeColor(<span class="string">"EdgeColor"</span><span>,Color) =  (1,1,1,1)  </span></span></li><li class=""><span>        _StartTime(<span class="string">"StartTime"</span><span>,Float) = 0  </span></span></li><li class="alt"><span>    }  </span></li><li class=""><span>    SubShader   </span></li><li class="alt"><span>    {  </span></li><li class=""><span>        Tags { <span class="string">"RenderType"</span><span>=</span><span class="string">"Opaque"</span><span> }  </span></span></li><li class="alt"><span>          </span></li><li class=""><span>        Pass  </span></li><li class="alt"><span>        {  </span></li><li class=""><span>            CGPROGRAM  </span></li><li class="alt"><span><span class="preprocessor">            #pragma vertex vert_img</span><span>  </span></span></li><li class=""><span><span class="preprocessor">            #pragma fragment frag</span><span>  </span></span></li><li class="alt"><span><span class="preprocessor">            #include "UnityCG.cginc"</span><span>  </span></span></li><li class=""><span>               </span></li><li class="alt"><span>            uniform sampler2D _MainTex;  </span></li><li class=""><span>            uniform sampler2D _NoiseTex;  </span></li><li class="alt"><span>            uniform <span class="keyword">float</span><span> _DissolveSpeed;  </span></span></li><li class=""><span>            uniform <span class="keyword">float</span><span> _EdgeWidth;  </span></span></li><li class="alt"><span>            uniform float4 _EdgeColor;  </span></li><li class=""><span>            uniform <span class="keyword">float</span><span> _StartTime;  </span></span></li><li class="alt"><span>  </span></li><li class=""><span>            float4 frag(v2f_img i):COLOR  </span></li><li class="alt"><span>            {  </span></li><li class=""><span>                <span class="keyword">float</span><span> DissolveFactor = saturate((_Time.y - _StartTime) / _DissolveSpeed);  </span></span></li><li class="alt"><span>                <span class="keyword">float</span><span> noiseValue = tex2D(_NoiseTex,i.uv).r;              </span></span></li><li class=""><span>                  </span></li><li class="alt"><span>                float4 texColor = tex2D(_MainTex,i.uv);  </span></li><li class=""><span>                <span class="keyword">float</span><span> EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor));  </span></span></li><li class="alt"><span>                float4 BlendColor = texColor * _EdgeColor;  </span></li><li class=""><span>                  </span></li><li class="alt"><span>                clip(1 - EdgeFactor - 0.01);  </span></li><li class=""><span>                <span class="keyword">return</span><span> lerp(BlendColor,texColor,1 - EdgeFactor);  </span></span></li><li class="alt"><span>            }  </span></li><li class=""><span>              </span></li><li class="alt"><span>            ENDCG  </span></li><li class=""><span>        }  </span></li><li class="alt"><span>    }   </span></li><li class=""><span>      </span></li><li class="alt"><span>    FallBack Off  </span></li><li class=""><span>}  </span></li></ol></div><pre code_snippet_id="1693878" snippet_file_name="blog_20160523_2_8350366" name="code" class="csharp" style="display: none;">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
}</pre><br>
在给出的参考链接中,可以很好地了解到原理,这里就不解释了,而重现效果不过就是溶解效果的反转了。这里需要控制一下时间:
<p></p>
<p></p>
<div class="dp-highlighter bg_csharp"><div class="bar"><div class="tools"><b>[csharp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 734px; top: 4625px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/1693878" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/1693878/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-c"><li class="alt"><span><span>material.SetFloat(</span><span class="string">"_StartTime"</span><span>, Time.realtimeSinceStartup);  </span></span></li></ol></div><pre code_snippet_id="1693878" snippet_file_name="blog_20160523_3_2636528" name="code" class="csharp" style="display: none;">material.SetFloat("_StartTime", Time.realtimeSinceStartup);</pre><br>
<p></p>
   
</div>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值