如上图所示,本shader的功能就是让箱子一点一点的消融,然后逐渐消失。
这个shader功能主要分为两个部分,第一个部分是消失,第二个部分是边缘着色,第三个部分是自定义阴影投射的Pass。
消失的实现是比较简单的,只需要一行代码即可,clip(burn.r - _BurnAmount);直接裁减掉不满足要求的片元,burn是一个噪声图,这样可以形成随机消失的效果。
边缘着色部分的代码还是有一定的水平的,通过burn.r-_BurnAmount值的大小来判定其离消失的点的距离,然后把这个值平滑到0~_LineWidth区间中,通过这个值在原纹理和被烧焦的颜色之间进行差值即可。为了优化视觉效果,代码中还通过这个值对两种烧焦的颜色进行采样,然后还还了五次方,这些操作我想大抵上还是经验所得。
最后一个功能就是阴影投射纹理,因为如果直接使用系统的阴影投射纹理的话,裁剪掉的内容还是会在阴影中显示出来的,所以,需要自己写阴影投射纹理,在阴影投射纹理中也同样裁剪掉相同的点,这一部分更多的是使用系统的API,属于记忆部分。
完整代码如下:

Shader "Unity Shaders Book/Chapter 15/Dissolve" {Properties {_BurnAmount ("Burn Amount", Range(0.0, 1.0)) = 0.0_LineWidth("Burn Line Width", Range(0.0, 0.2)) = 0.1_MainTex ("Base (RGB)", 2D) = "white" {}_BumpMap ("Normal Map", 2D) = "bump" {}_BurnFirstColor("Burn First Color", Color) = (1, 0, 0, 1)_BurnSecondColor("Burn Second Color", Color) = (1, 0, 0, 1)_BurnMap("Burn Map", 2D) = "white"{}}SubShader {Tags { "RenderType"="Opaque" "Queue"="Geometry"}Pass {Tags { "LightMode"="ForwardBase" }Cull OffCGPROGRAM#include "Lighting.cginc"#include "AutoLight.cginc"#pragma multi_compile_fwdbase#pragma vertex vert#pragma fragment fragfixed _BurnAmount;fixed _LineWidth;sampler2D _MainTex;sampler2D _BumpMap;fixed4 _BurnFirstColor;fixed4 _BurnSecondColor;sampler2D _BurnMap;float4 _MainTex_ST;float4 _BumpMap_ST;float4 _BurnMap_ST;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float4 tangent : TANGENT;float4 texcoord : TEXCOORD0;};struct v2f {float4 pos : SV_POSITION;float2 uvMainTex : TEXCOORD0;float2 uvBumpMap : TEXCOORD1;float2 uvBurnMap : TEXCOORD2;float3 lightDir : TEXCOORD3;float3 worldPos : TEXCOORD4;SHADOW_COORDS(5)};v2f vert(a2v v) {v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);o.uvMainTex = TRANSFORM_TEX(v.texcoord, _MainTex);o.uvBumpMap = TRANSFORM_TEX(v.texcoord, _BumpMap);o.uvBurnMap = TRANSFORM_TEX(v.texcoord, _BurnMap);TANGENT_SPACE_ROTATION;o.lightDir = mul(rotation,  ObjSpaceLightDir(v.vertex)).xyz;o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;TRANSFER_SHADOW(o);return o;}fixed4 frag(v2f i) : SV_Target {fixed3 burn = tex2D(_BurnMap, i.uvBurnMap).rgb;clip(burn.r - _BurnAmount);float3 tangentLightDir = normalize(i.lightDir);fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap,  i.uvBumpMap));fixed3 albedo = tex2D(_MainTex, i.uvMainTex).rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz *  albedo;fixed3 diffuse = _LightColor0.rgb * albedo * max(0,  dot(tangentNormal, tangentLightDir));fixed t = 1 - smoothstep(0.0, _LineWidth, burn.r -  _BurnAmount);fixed3 burnColor = lerp(_BurnFirstColor,  _BurnSecondColor, t);burnColor = pow(burnColor, 5);UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);fixed3 finalColor = lerp(ambient + diffuse * atten,  burnColor, t * step(0.0001, _BurnAmount));return fixed4(finalColor, 1);}ENDCG}// Pass to render object as a shadow casterPass {Tags { "LightMode" = "ShadowCaster" }CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_shadowcaster#include "UnityCG.cginc"fixed _BurnAmount;sampler2D _BurnMap;float4 _BurnMap_ST;struct v2f {V2F_SHADOW_CASTER;float2 uvBurnMap : TEXCOORD1;};v2f vert(appdata_base v) {v2f o;TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)o.uvBurnMap = TRANSFORM_TEX(v.texcoord, _BurnMap);return o;}fixed4 frag(v2f i) : SV_Target {fixed3 burn = tex2D(_BurnMap, i.uvBurnMap).rgb;clip(burn.r - _BurnAmount);SHADOW_CASTER_FRAGMENT(i)}ENDCG}}FallBack "Diffuse"
}

unity 消融效果相关推荐

  1. Unity Shader学习:Dissolve消融效果

    Unity Shader学习:Dissolve消融效果 消融效果在游戏里非常常用,这里简单的实现下,代码里用到了if分支在shader里可能会费一点,如果想直接用puppet_master大佬版本的话 ...

  2. 【Unity Shader 消融效果_案例分享】

    1.实现逻辑 消融效果主要是利用了Shader中的clip()函数,也就是透明测试功能,在ASE中叫"Opacity Mask". 消融效果是基于一张"Noise&quo ...

  3. UnityShader入门精要——消融效果

    消融效果 原理:噪声纹理+透明度测试 使用噪声纹理采样的结果和某个控制消融程度的阈值比较,如果小于阈值,就使用clip函数把它对应的像素裁剪掉,这些部分就对应了图中被"烧毁"的区域 ...

  4. 练习项目(二):消融效果

    概述 本篇是"练习项目"系列的第二篇,主要介绍一下利用消融实现的效果.在游戏开发的过程中,有很多看起来很神奇的效果,都是使用消融的原理实现的. 原理 主要的原理,就是使用噪声图和透 ...

  5. Shader学习的基础知识( 三十)消融效果

    消融效果其实就是噪声纹理+透明度测试,取样阈值在小于0则裁剪掉,0到N显示中间色,N到1则正常显示. Shader "Unity Shaders Book/Chapter 15/Dissol ...

  6. Unity_Shader高级篇_15_Unity Shader入门精要_消融效果

    第15章 使用噪音 很多时候,向规则的事物里添加一些"杂乱无章"的效果往往会有意想不到的效果.而这些"杂乱无章"的效果来源就是噪音.在本章中,我们将会学习如何使 ...

  7. Unity镜子效果的实现(无需镜子Shader)

    Unity镜子效果制作教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  8. Unity3d shader实现消融效果

    实现原理:噪声纹理+透明度测试 噪声纹理: 在我的理解下就是,存储着随机值的一张纹理图片,因为大量生成随机数非常的耗时而且麻烦,如果用一张图来存储随机值,这样获取起来会非常的简单高效,利用噪声纹理我们 ...

  9. CocosCreator消融效果

    效果预览 前期准备 首先我们准备一张噪声图用于后续的噪声消融 核心思路 片段着色器中有一个discard可以将片元的颜色丢弃,那我们的可以读取当前片元的某一个颜色基色(r.g.b),与我们的消融阈值b ...

最新文章

  1. 如何点击TextField不弹出键盘?
  2. SpringMVC 学习笔记(五) 基于RESTful的CRUD
  3. 中国福建省动漫产业建设开发现状及未来策略规划调研报告2021-2027年
  4. Java进阶:CyclicBarrier基本使用
  5. 【java学习笔记】浅析JavaWeb开发中Model1模式和Model2模式
  6. .net core 基于 IHostedService 实现定时任务
  7. iyiw oracle_Oracle 单行函数
  8. SPSS编程-统计自动化-VBA脚本开发
  9. Office 解决WORD转PDF未显示书签。
  10. 汇总我关注的技术博主的2021年度总结
  11. Tiger DAO VC:DAO组织风险投资时代来临
  12. C++snprintf的使用
  13. inject类型丢失问题
  14. App磁盘沙盒工具实践
  15. 微软将推新AI聊天机器人Zo 可能是小冰的英文版
  16. C# SQLite 数据库基本操作
  17. Hikey970——Lebuntu环境配置
  18. arduino tft 方向_怎样将TFT 1.44与Arduino Nano结合使用
  19. 【慕伏白教程】《动手学深度学习》学习环境安装流程
  20. 被动信息收集----指纹识别(CMS识别)

热门文章

  1. 墨者网络安全——浏览器信息伪造
  2. 何为数字化工厂?如何打造真正的数字化工厂?
  3. 程序员推荐简单有效的科学健脑方法
  4. Baklib分享 | 独立知识库软件为您的企业带来的好处
  5. C/C++编程:如何写一个Web服务器
  6. learning的反义词英文_英语反义词
  7. 软考5个高级难度最小的是哪个?哪个通过率高一些?
  8. php unoconv,使用 unoconv 将 PPT 转换成 PDF
  9. 我想讲的,都在这个故事里
  10. 基于OpenCV的传统视觉应用 -- OpenCV图像处理 图像模糊处理 图像锐化处理