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 ...
随机推荐
- 在新的线程中使用session 出现的问题
Exception in thread "Thread-15" java.lang.IllegalStateException: No thread-bound request f ...
- 使用pytorch快速搭建神经网络实现二分类任务(包含示例)
使用pytorch快速搭建神经网络实现二分类任务(包含示例) Introduce 上一篇学习笔记介绍了不使用pytorch包装好的神经网络框架实现logistic回归模型,并且根据autograd实现 ...
- springboot 使用DruidDataSource 数据源
一.添加依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</art ...
- 使用Vscode进行Python开发环境配置
Vscode是是一个强大的跨平台工具,我自己电脑是mac,公司电脑是win而且是内部环境,导致公司安装软件很费劲.好在vscode许多插件能直接离线安装,省去了很多麻烦. 很多人学习python,不知 ...
- 7、Prototype 原型模式 通过复制创造实例 创造型模式
2020-07-19 发哥讲 发哥讲 其实上一节的末尾讲到如何去生成对象,其中有一个关于clone的,这其实就是Prototype原型模式. 通过克隆(拷贝)的方式生成对象 1.了解Prototype ...
- Homekit_温湿度_人体红外_光强_传感器
市面上大多数,传感器产品多是简单的单个传感器进行售卖,这里我推荐一款四合一的产品,使用Homekit进行控制. 前置需求: 苹果手机一台 四合一传感器一个 USB数据线一根 介绍: 1.外观上是一个小 ...
- 树堆(Treap)学习笔记 2020.8.12
如果一棵二叉排序树的节点插入的顺序是随机的,那么这样建立的二叉排序树在大多数情况下是平衡的,可以证明,其高度期望值为 \(O( \log_2 n )\).即使存在一些极端情况,但是这种情况发生的概率很 ...
- Revit二次开发——非模态窗口的事件处理
一.起因 自己在写revit二开时,有一个Winform窗体按钮点击事件需要 触发调用事务进行处理,结果出现“异常“Starting a transaction from an external ...
- HashMap 21问!!
1:HashMap的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过8时,链表转换为红黑树. transient Node<K,V>\[\] t ...
- Windows下nacos单机部分发现的坑
一.下载nacos的地址: https://github.com/alibaba/nacos/releases 下载 nacos-server-1.3.2.tar.gz 就好 二.在Window ...