(转)溶解shader
游戏中物体腐化消失,燃烧消失时,会有从局部慢慢消失的效果,然后配合一些粒子特效,就能达到非常好的美术效果。
类似效果如下:
注:
_DissColor为溶解主色,_AddColor为叠加色,按照溶解的移动方向来看开始色为DissColor+AddColor
上图中DissColor为红色,AddColor为绿色
所以燃烧时
开始色为DissColor + AddColor = 黄色
默认色为DissColor 红色
然后配上火的粒子特效,这样就能模拟比较真实的燃烧效果。
我们也可以设置其他的颜色,比如被各种魔法,化学物品击中.....算了,不敢想象了,好残忍
代码和原理如下:
表面着色器:
Shader "Dissolve/Dissolve_TexturCoords" {
Properties {
_Color ("主颜色", Color) = (,,,) // 主色
_MainTex ("模型贴图", 2D) = "white" {} // 主材质
_DissolveText ("溶解贴图", 2D) = "white" {} // 溶解贴图
_Tile("溶解贴图的平铺大小", Range (, )) = // 平铺值,设置溶解贴图大小 _Amount ("溶解值", Range (, )) = 0.5 // 溶解度
_DissSize("溶解大小", Range (, )) = 0.1 // 溶解范围大小 _DissColor ("溶解主色", Color) = (,,,) // 溶解颜色
_AddColor ("叠加色,与主色叠加为开始色[R|G|B>0表示启用]", Color) = (,,,) // 改色与溶解色融合形成开始色
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD
Cull off CGPROGRAM
#pragma target 3.0
#pragma surface surf BlinnPhong sampler2D _MainTex;
sampler2D _DissolveText;
fixed4 _Color; // 主色
half _Tile; // 平铺值
half _Amount; // 溶解度
half _DissSize; // 溶解范围
half4 _DissColor; // 溶解颜色
half4 _AddColor; // 叠加色
// 最终色
static half3 finalColor = float3(,,); struct Input {
float2 uv_MainTex; // 只需要主材质的UV信息
}; void surf (Input IN, inout SurfaceOutput o) {
// 对主材质进行采样
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
// 设置主材质和颜色
o.Albedo = tex.rgb * _Color.rgb;
// 对裁剪材质进行采样,取R色值
float ClipTex = tex2D (_DissolveText, IN.uv_MainTex/_Tile).r; // 裁剪量 = 裁剪材质R - 外部设置量
float ClipAmount = ClipTex - _Amount;
if(_Amount > )
{
// 如果裁剪材质的R色值 < 设置的裁剪值 那么此点将被裁剪
if(ClipAmount < )
{
clip(-0.1);
}
// 然后处理没有被裁剪的值
else
{
// 针对没有被裁剪的点,【裁剪量】小于【裁剪大小】的做处理
// 如果设置了叠加色,那么该色为ClipAmount/_DissSize(这样会形成渐变效果)
if(ClipAmount < _DissSize)
{
if(_AddColor.x == )
finalColor.x = _DissColor.x;
else
finalColor.x = ClipAmount/_DissSize; if (_AddColor.y == )
finalColor.y = _DissColor.y;
else
finalColor.y = ClipAmount/_DissSize; if (_AddColor.z == )
finalColor.z = _DissColor.z;
else
finalColor.z = ClipAmount/_DissSize;
// 融合
o.Albedo = o.Albedo * finalColor * ;
}
}
}
o.Alpha = tex.a * _Color.a;
}
ENDCG
}//endsubshader
}
CG:
//溶解
Shader "Dissolve" {
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_DissolorTex ("DissolorTex (RGB)", 2D) = "white" {}
_RAmount ("RAmount", Range (, )) = 0.5 _DissolorWith("DissolorWith", float) = 0.1//溶解过度宽度
_DissColor ("DissColor", Color) = (,,,)//溶解颜色
_Illuminate ("Illuminate", Range (, )) =
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD
Pass
{
CGPROGRAM
#include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
float2 texcoord1 : TEXCOORD1;
};
struct v2f
{
float4 pos : POSITION;
half2 texcoord : TEXCOORD0;
half2 texcoord1 : TEXCOORD1;
}; sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _DissolorTex;
float4 _DissolorTex_ST;
half _RAmount; half _DissolorWith;
half4 _DissColor;
half _Illuminate; v2f vert(appdata v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
o.texcoord1 = TRANSFORM_TEX(v.texcoord1, _DissolorTex);
return o;
} half4 frag(v2f i) :COLOR
{
half4 mainCol = tex2D(_MainTex,i.texcoord);
half4 DissolorTexCol = tex2D(_DissolorTex,i.texcoord1);
half clipVauleR = DissolorTexCol.r - _RAmount;
if(clipVauleR <= )
{
if(clipVauleR > -_DissolorWith)
{
if(_RAmount != )
{
//插值颜色过度
float t = clipVauleR / -_DissolorWith;
mainCol = lerp(mainCol, _DissColor, t);
}
else
{
discard;
}
}
else
{
discard;
} } return mainCol * _Illuminate;
}
#pragma vertex vert
#pragma fragment frag ENDCG
} } }
(转)溶解shader的更多相关文章
- Unity中溶解shader的总结
在实际的游戏工程中,经常美术和策划会提出溶解的表现要求.比如子弹在飞行的时候,弹道不断的消融:角色受到大型炮弹的攻击,在击飞的时候不断的消融等等诸如此类的表现.一般的消融都是结合粒子系统来实现,通过给 ...
- 溶解shader
玩神界原罪2,感觉人物被建筑遮挡时,建筑的“溶解”效果很有意思,想实现一下.然后发现连溶解都没实现过,emmmmm....先来把溶解实现了~ 原理就是根据一张噪声图的值是否大于某个阈值,来判断是否丢弃 ...
- 小强学渲染之Unity Shader噪声应用
之前玩Tencent的仙剑4手游时,杀死boss会看到boss有“消融”的效果,就是身体上有多个洞洞然后往四周扩散直至尸体完全消失,但效果是没有关闭背面剔除的“穿帮”效果,可能也是考虑性能因素. em ...
- Shader实例:溶解效果(Dissolve)
效果: 图左:一道金光闪过,瞬间灰飞烟灭 图右:燃烧效果,先过渡到黄色,然后渐渐过渡到黑色,最后消失殆尽. 这是游戏中常见的效果,各位可以想想自己玩过的游戏. 手头正在玩的,梦三国手游,死亡的时候就是 ...
- unity3d 游戏插件 溶解特效插件 - Dissolve Shader
unity3d 游戏插件 溶解特效插件 - Dissolve Shader 链接: https://pan.baidu.com/s/1hr7w39U 密码: 3ed2
- pixijs shader 贴图溶解效果教程
pixijs shader 贴图溶解效果教程 我直接贴代码了 没什么好讲解了 稍微有点基础的人应该能看懂 const app = new PIXI.Application({ transparent: ...
- Shader之溶解效果的几种实现方法
这里通过 “是否丢弃像素”的2种方法,写2个shader,效果是一样的,也提到了,丢弃某个像素的3种方式. 是否丢弃: 1.通过脚本控制shader变量判断当前是否丢弃像素,需要额外脚本: 2.sha ...
- Shader Forge 刀光溶解
实际特效时,时间可以控制vertex color.a,shader forge 还只是玩具,试验用具,离商业产品质量还有差距. 其实,有技术美术的画,很多问题,美术能自己解决,都是一些欠缺通道的问题, ...
- 学习游戏渲染(Shader)的用处
本文在讨论的主题并不限于具体引擎或具体语言,为了说明方便可能会提到Unity的一些内容. 最近渐渐发现很多从事游戏开发的新人,对于学会写Shader似乎总是有几分神往,但一般入了门或者学了一段时间后 ...
随机推荐
- Java中使用多线程、curl及代理IP模拟post提交和get访问
Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...
- HOWTO: Use STM32 SPI half duplex mode
HOWTO: Use STM32 SPI half duplex mode I’ve got my hands onto some STM32F030F4P6 ARM-Cortex M0 proces ...
- OpenOCD 0.9.0 release
OpenOCD 0.9.0 release May 18th, 2015 I’m happy to announce the release of OpenOCD version 0.9.0, fin ...
- CRM上线之路 走上了CRM实施顾问-第12天上班 -第三周
今天是周五,<CRM初期需求说明>是经理们商讨的,总共2张纸,根据两次会议,我写了<CRM需求说明>总共18面. 这是这周的工作汇报,其实,报告是我一天内写出来的,中午饭都没吃 ...
- swift笔记(二) —— 运算符
基本运算符 Swift支持大部分的标准C语言的操作符,而且做了一些改进,以帮助开发人员少犯低级错误,比方: 本该使用==的时候,少写了个=, if x == y {-} 写成了 if x = y {- ...
- WebLogic使用总结(五)——Web项目使用Sigar在WebLogic服务器部署遇到的问题
今天在WebLogic 12c服务器上部署Web项目时,碰到了一个问题.项目中使用到了"Sigar.jar"监控Window平台下的cpu使用率.内存使用率和硬盘信息,sigar. ...
- Win10年度更新开发必备:VS2015 Update 1正式版下载汇总
微软在12月1日发布了Visual Studio 2015 Update 1 .在MSDN中微软也提供下载,而且MSDN的Visual Studio 2015 Update 1与官方免费下载的文件是一 ...
- 关于pcie的备忘
总线驱动:深度优先统计资源,深度滞后分配资源 资源包括Bus id和内存(prefectable和non-prefectable内存) 设备驱动:包括设备驱动层和消息通信 主要是四个部分: (1)中断 ...
- 算法竞赛入门经典+挑战编程+USACO
下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...
- spring 4.1.4 发布
Spring 框架今天发布了三个更新版本,分别是 4.1.4.4.0.9 和 3.2.13 版本. 这三个版本都是新年的维护版本,修复了各种小 bug,小改进等. via spring blog De ...