shader编程学习(3)溶解

原创 2015年11月19日 11:50:40

shader代码

Shader "Custom/zxtest"
{
    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)//边缘的颜色
    }
    SubShader 
    {
        Tags { "RenderType"="Opaque" }
        
        Pass
        {
            CGPROGRAM
            #pragma vertex vert_img//顶点着色器 它会自动把结果返回到一个v2f_img结构体中
            #pragma fragment frag
            #include "UnityCG.cginc"
             
            uniform sampler2D _MainTex;
            uniform sampler2D _NoiseTex;
            uniform float _DissolveSpeed;
            uniform float _EdgeWidth;
            uniform float4 _EdgeColor;
            
			//v2f_img 自带的结构体 包含顶点坐标,和uv坐标
            float4 frag(v2f_img i):COLOR
            {
				//时间比例 0-1
				//unity给我们提供了几个不同的时间参数都保存在_Time中,其中_Time.y是标准的时间,单位(s)
                float DissolveFactor = saturate(_Time.y / _DissolveSpeed);
				//取得r值
                float noiseValue = tex2D(_NoiseTex,i.uv).r; 
				//如果r值小于时间比例
                if(noiseValue <= DissolveFactor)
                {
					//discard,是由CG提供的,若出现在fragmentShader中表示立即放弃当前处理的片元。
					//也就是说当我们判定当前片元需要溶解的时候我们就使用discard命令
                    discard;
                }
             
                float4 texColor = tex2D(_MainTex,i.uv);
				//EdgeFactor(0-1)越小表示越快要溶解,即越接近边缘
                float EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor));
                float4 BlendColor = texColor * _EdgeColor;
                //lerp(x,y,a) = x*(1-a) + y*a; 越靠近边缘,颜色越接近定义的边缘颜色
                return lerp(texColor,BlendColor,1 - EdgeFactor);
            }
            
            ENDCG
        }
    } 
    
    FallBack Off
}

效果




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

shader溶解特效

前言:在游戏中间我们常常看见物体会慢慢消融,变为灰烬,这个效果可以用于人物的消失,毁灭. 代码: Shader "Esfog/Dissolve" { Properties ...

Unity Shader编程(3)uv操作

Unity Shader编程(3)uv操作 1、shader示意图 2、uv常用操作 ①缩放 Shader "Custom/NewShader" { Properties { _...

Cocos2d-x shader学习3: sprite描边(Outline)

Cocos2d-x 3.x的label使用了freetype字体引擎(http://www.freetype.org/),可以很轻松的实现描边和阴影效果。所以本篇文章只针对于sprite来实现描边效果...

shader学习(3)

1、一个简单的shader程序Shader "xxx/ddd" { SubShader { pass //至少一个通道 { ...

[Unity3D]Shader学习笔记之图像编程接口与着色语言

图像编程接口  如果开发者直接访问CPU、寄存器、显存等硬件设备将会是一件非常麻烦的事情,为了方便使用在这些硬件的基础上实现了一层抽象,这就是图像编程接口。   OpenGL和DirectX就是这些...

shader编程学习(4)Logo闪光

shader代码 Shader "Custom/zxtest" { Properties { _MainTex ("Texture", 2D) = "white" { } ...

蛋哥的学习笔记之-基于Unity的Shader编程:0-1 开篇计划+发泄一堆废话

行万里路,读万卷书!!! 其实我们每个人都趟在一口井里,每个人都透过井口仰望天空,并且对自己看到的世界深信不疑,而真正的智者会努力通过别人的眼睛,去了解他看不到的世界!!! ...

蛋哥的学习笔记之-基于Unity的Shader编程:0-2 基本3D图形渲染管线概述

一、要干些啥: 今天主要概括和整理下基本的3D图形渲染管线,说白了就是让大家了解一下,我们是如何通过给定的一堆数据:视点(相机)、3D模型、光源、光照模型、纹理和渲染方式等,进行一系...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)