Shader之溶解效果的几种实现方法
这里通过 “是否丢弃像素”的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之溶解效果的几种实现方法的更多相关文章
- 给子元素设置margin-top无效果的一种解决方法
在写一个登陆界面的时候,设置登录按钮的margin-top时出了问题 先是这么写的 <div style="margin-top:30px"> <a style= ...
- Shader实例:溶解效果(Dissolve)
效果: 图左:一道金光闪过,瞬间灰飞烟灭 图右:燃烧效果,先过渡到黄色,然后渐渐过渡到黑色,最后消失殆尽. 这是游戏中常见的效果,各位可以想想自己玩过的游戏. 手头正在玩的,梦三国手游,死亡的时候就是 ...
- unity3d shader之Roberts,Sobel,Canny 三种边缘检测方法
方法其实都差不多,就是用两个过滤器,分别处理两个分量 Sobel算子 先说Sobel算子 GX为水平过滤器,GY为垂直过滤器,垂直过滤器就是水平过滤器旋转90度.过滤器为3x3的矩阵,将与图像作平面卷 ...
- Android 文字自动滚动(跑马灯)效果的两种实现方法[特别好使]
有时候在xml中写的跑马灯效果不滚动:原因有以下 Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize=”marquee” 2.TextV ...
- Android MaterialDesign之水波点击效果的几种实现方法
什么是水波点击的效果? 下面是几种不同的实现方法的效果图以及实现方法 Video_2016-08-31_003846 如何实现? 方法一 使用官方提供的RippleDrawable类 优点:使用方 ...
- pixijs shader 贴图溶解效果教程
pixijs shader 贴图溶解效果教程 我直接贴代码了 没什么好讲解了 稍微有点基础的人应该能看懂 const app = new PIXI.Application({ transparent: ...
- Esfog_UnityShader教程_溶解效果Dissolve
溶解效果在游戏中是很常见的,比如在一些神话或者魔法世界中,一些NPC角色在剧情需要时候会身体会渐渐的消失掉.甚至有一些更炫的,比如用火焰喷射器把目标燃尽.这些都可以用到溶解效果.这篇文章主要是讲解一下 ...
- Unity Shader 之 透明效果
透明效果 透明效果一般有两种实现方法: 第一种,使用透明度测试(Alpha Test) 第二种,使用透明度混合(Alpha Blending) 透明度测试和透明度混合机制: 透明度测试(Alpha T ...
- Unity Shader实现描边效果
http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...
随机推荐
- 009_go语言中的slices分片
代码演示 package main import "fmt" func main() { s := make([]string, 3) fmt.Println("emp: ...
- linux常用命令(一)软件操作命令
软件包管理器:yum 安装软件:yum install xxx 卸载软件:yum remove xxx 搜索软件:yum search xxx 清理缓存:yum clean packages 列出已安 ...
- 深度学习 | 训练网络trick——mixup
1.mixup原理介绍 mixup 论文地址 mixup是一种非常规的数据增强方法,一个和数据无关的简单数据增强原则,其以线性插值的方式来构建新的训练样本和标签.最终对标签的处理如下公式所示,这很简单 ...
- Mysql Column 'xxxxx' in field list is ambiguous"
使用了关联查询,两张表有相同的字段,所以说取值含糊不清: 使用别名.列名解决: 如 a.description
- Setup Factory 9 打包安装程序过程中提示安装.net4.5、并启用md5加密算法
1.在Before Installing选项卡中选择Ready to Install,点击Edit进入编辑窗口,切到最后一个选项卡Actions,把判断内容复制进去 -- These actions ...
- 【算法•日更•第十期】树型动态规划&区间动态规划:加分二叉树题解
废话不多说,直接上题: 1580:加分二叉树 时间限制: 1000 ms 内存限制: 524288 KB提交数: 121 通过数: 91 [题目描述] 原题来自:NOIP 20 ...
- 几种定时任务(Timer、TimerTask、ScheduledFuture)的退出—结合真实案例【JAVA】
工作中常常会有定时任务的开发需求,特别是移动端.最近笔者正好有所涉及,鉴于此,结合开发中的案例说明一下几种定时任务的退出. 需求说明:定时更新正在生成的文件大小和状态[进行中.失败.完成],如果文件生 ...
- Dotnet Core Public API的安全实践
公开API的安全,其实更重要. 一.API的安全 作为一个Dotnet Core的老司机,写API时,能兼顾到API的安全,这是一种优雅. 通常,我们会用认证来保证API的安全,无敌的Auth ...
- OAuth2.0分布式系统环境搭建
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 介绍 OAuth(开放授权)是一 ...
- 运用sklearn进行线性判别分析(LDA)代码实现
基于sklearn的线性判别分析(LDA)代码实现 一.前言及回顾 本文记录使用sklearn库实现有监督的数据降维技术——线性判别分析(LDA).在上一篇LDA线性判别分析原理及python应用(葡 ...