这里通过 “是否丢弃像素”的2种方法,写2个shader,效果是一样的,也提到了,丢弃某个像素的3种方式。

是否丢弃:

  1.通过脚本控制shader变量判断当前是否丢弃像素,需要额外脚本;

  2.shader根据当前时间控制是否丢弃某个像素,不需要额外脚本。

丢弃方法:

  1.通过clip函数进行丢弃像素;

  2.通过discard丢弃像素;

  3.通过设置alpha变量为0丢弃像素。

1)DissolveOne.shader通过脚本控制

Shader "Unlit/DissolveOne"
{
Properties
{
//外部脚本控制_Value来控制是否丢弃某个像素
_MainTex ("Texture", 2D) = "white" {}
_DissolveTex("Texture", 2D) = "white" {}
_DissSize("DissSize", Range(, )) = 0.1 //溶解阈值,小于阈值才属于溶解带
_DissColor("DissColor", Color) = (,,,)//溶解带的渐变颜色,与_AddColor配合形成渐变色
_AddColor("AddColor", Color) = (,,,)
_Value("Value", Range(,)) = 0.5 //这个属性其实不用开放出来的,通过脚本控制就好,但我想看效果却懒得写脚本,就这样吧
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
}; sampler2D _MainTex;
sampler2D _DissolveTex;
float4 _MainTex_ST;
half _Value;//脚本控制的变量
half _DissSize;
half4 _DissColor, _AddColor; v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
float dissolveValue = tex2D(_DissolveTex, i.uv).r;
float clipValue = dissolveValue - _Value;
clip(clipValue);// 如果clipValue<0则抛弃当前像素,
//clip is equivalent to (if(clipValue<0)discard;),但好像好像discard需要更高一点的硬件支持
//也可以通过设置col.a = 0抛弃当前像素:if(clipValue<0)col.a = 0;
if (clipValue > && clipValue < _DissSize)
{
//溶解带渐变
half4 dissolveColor = lerp(_DissColor, _AddColor, clipValue / _DissSize)* ;
col *= dissolveColor;
}
return col;
}
ENDCG
}
}
}

2)DissolveTwo.shader根据当前时间控制是否丢弃某个像素

Shader "Unlit/DissolveTwo"
{
Properties
{
//shader根据当前时间控制是否丢弃某个像素
_MainTex("Texture", 2D) = "white" {}
_DissolveTex("Texture", 2D) = "white" {}
_DissSize("DissSize", Range(, )) = 0.1 //溶解阈值,小于阈值才属于溶解带
_DissColor("DissColor", Color) = (,,,)//溶解带的渐变颜色,与_AddColor配合形成渐变色
_AddColor("AddColor", Color) = (,,,)
_DissSpeed("DissSpeed", Float) =
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
}; sampler2D _MainTex;
sampler2D _DissolveTex;
float4 _MainTex_ST;
half _DissSize;
half4 _DissColor, _AddColor;
half _DissSpeed; v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
//因为这个溶解过程很快,所以为了看效果,可以改成:saturate(_Time.y % _DissSpeed / _DissSpeed),重复溶解
float dissolveFactor = saturate(_Time.y / _DissSpeed);
float dissolveValue = tex2D(_DissolveTex, i.uv).r;
float delta = dissolveValue - dissolveFactor;
if (delta < )
{
discard;
} if (delta >= && delta < _DissSize)
{
float leftFactor = delta / _DissSize;
half4 dissolveColor = lerp(_DissColor, _AddColor, leftFactor) * ;
col *= dissolveColor;
}
return col;
}
ENDCG
}
}
}

两者溶解效果是一样的:

参考文章:

1.http://blog.csdn.net/u011047171/article/details/46873217

2.http://www.cnblogs.com/Esfog/p/DissolveShader.html

Shader之溶解效果的几种实现方法的更多相关文章

  1. 给子元素设置margin-top无效果的一种解决方法

    在写一个登陆界面的时候,设置登录按钮的margin-top时出了问题 先是这么写的 <div style="margin-top:30px"> <a style= ...

  2. Shader实例:溶解效果(Dissolve)

    效果: 图左:一道金光闪过,瞬间灰飞烟灭 图右:燃烧效果,先过渡到黄色,然后渐渐过渡到黑色,最后消失殆尽. 这是游戏中常见的效果,各位可以想想自己玩过的游戏. 手头正在玩的,梦三国手游,死亡的时候就是 ...

  3. unity3d shader之Roberts,Sobel,Canny 三种边缘检测方法

    方法其实都差不多,就是用两个过滤器,分别处理两个分量 Sobel算子 先说Sobel算子 GX为水平过滤器,GY为垂直过滤器,垂直过滤器就是水平过滤器旋转90度.过滤器为3x3的矩阵,将与图像作平面卷 ...

  4. Android 文字自动滚动(跑马灯)效果的两种实现方法[特别好使]

    有时候在xml中写的跑马灯效果不滚动:原因有以下 Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize=”marquee” 2.TextV ...

  5. Android MaterialDesign之水波点击效果的几种实现方法

    什么是水波点击的效果? 下面是几种不同的实现方法的效果图以及实现方法   Video_2016-08-31_003846 如何实现? 方法一 使用官方提供的RippleDrawable类 优点:使用方 ...

  6. pixijs shader 贴图溶解效果教程

    pixijs shader 贴图溶解效果教程 我直接贴代码了 没什么好讲解了 稍微有点基础的人应该能看懂 const app = new PIXI.Application({ transparent: ...

  7. Esfog_UnityShader教程_溶解效果Dissolve

    溶解效果在游戏中是很常见的,比如在一些神话或者魔法世界中,一些NPC角色在剧情需要时候会身体会渐渐的消失掉.甚至有一些更炫的,比如用火焰喷射器把目标燃尽.这些都可以用到溶解效果.这篇文章主要是讲解一下 ...

  8. Unity Shader 之 透明效果

    透明效果 透明效果一般有两种实现方法: 第一种,使用透明度测试(Alpha Test) 第二种,使用透明度混合(Alpha Blending) 透明度测试和透明度混合机制: 透明度测试(Alpha T ...

  9. Unity Shader实现描边效果

    http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...

随机推荐

  1. 打造静态分析器(二)基于Asp.Net Core 3.0的AspectCore组件检测

    上一篇,我们打造了一个简单的分析器,但是我们实际使用分析器就是为了对项目做分析检测,增加一些非语法的自检的 比如Asp.Net Core 3.0的替换依赖注入检测 设计分析 我们创建一个默认的Asp. ...

  2. Apache Hudi + AWS S3 + Athena实战

    Apache Hudi在阿里巴巴集团.EMIS Health,LinkNovate,Tathastu.AI,腾讯,Uber内使用,并且由Amazon AWS EMR和Google云平台支持,最近Ama ...

  3. 【工具】之001-CentOS7 最小化安装配置

    写在前面 我很懒,,,不想敲一个命令一个命令敲... "偷懒是有前提的,不是之前,就是之后." 简述 CentOS 7 最小化安装版本:CentOS-7-x86_64-Minima ...

  4. Kubeflow实战: 入门介绍与部署实践

    更多内容关注专辑: 机器学习实战 1 介绍 Kubeflow是在k8s平台之上针对机器学习的开发.训练.优化.部署.管理的工具集合,内部集成的方式融合机器学习中的很多领域的开源项目,比如Jupyter ...

  5. MacOS下如何优雅的使用冰蝎

    因为冰蝎也是使用 JAVA 写的跨平台应用程序,我们可以借助 macOS 自带的 自动操作 automator.app 来创建一个应用程序. 前言: 冰蝎是一种新型的Webshell连接工具,在日常的 ...

  6. java 序列化流与反序列化流

    一 对象序列化流ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStr ...

  7. java 异常一

    一 异常的继承体系 在Java中使用Exception类来描述异常. 查看API中Exception的描述,Exception 类及其子类是 Throwable 的一种形式,它用来表示java程序中 ...

  8. C#LeetCode刷题之#121-买卖股票的最佳时机(Best Time to Buy and Sell Stock)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4014 访问. 给定一个数组,它的第 i 个元素是一支给定股票第  ...

  9. Vue Vuex 严格模式+实例解析+dispatch/commit + state/getter

    1.严格模式 import getters from './getters' import mutations from './mutations' import actions from './ac ...

  10. Mybatis——ResultMap(结果集映射)的使用

    ResultMap的使用 在Mybatis中,可以使用resultMap(结果集映射)作为sql的返回类型 一般用来解决如下问题: 数据库表字段名和实体类属性名不一致的问题: 多对一问题: 例如:多个 ...