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 ...
随机推荐
- 18 . Go之操作Mysql
安装mysql wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm yum -y localinstall ...
- 聊聊WindowServer那些事!
前言说明 使用工具:VS2019 思考为什么要使用WindowServer,它能做什么了?(后面解答) 一:什么是WindowServer?(我们做的是一个什么东西?) Microso ...
- Hexo博客部署到远程仓库(Conding、Gitee、Github)
一.本地环境搭建 1.安装Git Git可以有效.高速的处理各种项目版本管理.也就是用来管理你的hexo博客文章,上传到GitHub的工具. Git下载地址 安装好了之后使用git -version查 ...
- 【模式识别与机器学习】——logistic regression
虽然叫做“回归”,但是这个算法是用来解决分类问题的.回归与分类的区别在于:回归所预测的目标量的取值是连续的(例如房屋的价格):而分类所预测的目标变量的取值是离散的(例如判断邮件是否为垃圾邮件).当然, ...
- JavaScript 实用方法
1.按时间显示问候语 2.强制光标停留位置 3.保存页面文本 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN& ...
- C#LeetCode刷题之#58-最后一个单词的长度(Length of Last Word)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3927 访问. 给定一个仅包含大小写字母和空格 ' ' 的字符串, ...
- 【笔记】 springCloud--Alibaba--服务注册和服务发现
接着上一次的nacos初步讲解和安装 任意门:https://www.cnblogs.com/Yangbuyi/p/13479767.html 如果启动失败的话 上一篇也是讲解过的. 本文章开始服务注 ...
- Salesforce学习笔记之Actions and Recommendations
设置Actions and Recommendations(Salesforce提供的标准元素),Salesforce上的文档说有两种方法,即Deployment和Process Builder(通过 ...
- 【支付宝SDK】沙箱调试,以及遇到的坑
from rest_framework.views import APIView from alipay import AliPay, DCAliPay, ISVAliPay from django. ...
- unity探索者之复制内容到剪贴板
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8417014.html unity中提供的TextEditor类,只能在window ...