Unity Shader学习:Dissolve消融效果

消融效果在游戏里非常常用,这里简单的实现下,代码里用到了if分支在shader里可能会费一点,如果想直接用puppet_master大佬版本的话可以自己改一下,主要if分支比较好理解,大佬的写法比较绕但是没用到分支,性能可能更好。

消融效果基本原理:利用噪声图的随机使主贴图在相应的位置逐渐剔除噪声颜色值小于一定阈值的像素,再在更靠内(噪声颜色值比阈值稍大一点)的地方安排一个内边缘,在内外边缘之间显示渐变的消融颜色。

shader部分:

Shader "Custom/DissolveEffect" {Properties {_MainTex("MainTex",2D)="white"{}_NoiseTex("NoiseTex",2D)="white"{}//高光大小_Gloss("Gloss",Range(0.0,20.0)) = 20.0//高光强度_SpecularFactor("SpecularFactor",Range(0.0,5.0)) = 1.0//消融阈值_DissolveThreshold("DissolveThreshold",Range(0.0,1.0)) = 0.5//消融系数(消融边界值=消融系数*消融阈值)_HalfDissolveThresholdFactor("HalfDissolveThresholdFactor",Range(1.0,2.0)) = 1.0//外侧颜色_DissolveEdgeColor("DissolveEdgeColor",Color) = (0,0,0,1)//内侧颜色_DissolveColor("DissolveColor",Color) = (1,0,0,1)}CGINCLUDE#include "Lighting.cginc"#include "UnityCG.cginc"sampler2D _MainTex;sampler2D _NoiseTex;float _Gloss;float _SpecularFactor;float _DissolveThreshold;float _HalfDissolveThresholdFactor;float4 _DissolveEdgeColor;float4 _DissolveColor;struct v2f {float4 pos:SV_POSITION;float3 worldNormal:TEXCOORD0;float2 uv:TEXCOORD1;float3 worldPos:TEXCOORD2;};v2f vert(appdata_full v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord;o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}float4 frag(v2f i) :SV_Target{//直接剔除小于阈值(越黑)的像素float4 noiseTexValue = tex2D(_NoiseTex, i.uv);if (noiseTexValue.r<_DissolveThreshold){discard;}//漫反射float3 worldNormal = normalize(i.worldNormal);float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);float3 lambert = max(0.0,dot(worldNormal, worldLightDir));float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;float3 diffuseColor = lambert *_LightColor0.xyz+ambient;diffuseColor = diffuseColor * tex2D(_MainTex, i.uv).rgb;//高光float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos);float3 halfDir = normalize(worldLightDir + viewDir);float3 specular = _LightColor0.xyz*pow(saturate(dot(halfDir, worldNormal)), _Gloss);float3 finalColor = diffuseColor + specular*_SpecularFactor;//消融边界区域的最小值float halfDissolveThreshold = _DissolveThreshold * _HalfDissolveThresholdFactor;//噪声像素大于消融阈值但小于消融边界值,渐变颜色if (noiseTexValue.r<halfDissolveThreshold){//得到噪声像素在两个边界间的权重float colorFactor = smoothstep(_DissolveThreshold, halfDissolveThreshold, noiseTexValue.r);//根据权重渐变颜色float3 finalColor = lerp(_DissolveColor, _DissolveEdgeColor, colorFactor);return float4(finalColor, 1);}else{//噪声像素大于消融边界值,返回漫反射return float4(finalColor, 1);}/*//用的话需要自行改动部分变量//大佬的优化版本,尽量不在shader中用分支判断的版本,但是代码很难理解啊....float percentage = _DissolveThreshold / dissolveValue.r;//如果当前百分比 - 颜色权重 - 边缘颜色float lerpEdge = sign(percentage - _ColorFactor - halfDissolveThreshold);//貌似sign返回的值还得saturate一下,否则是一个很奇怪的值fixed3 edgeColor = lerp(_DissolveEdgeColor.rgb, _DissolveColor.rgb, saturate(lerpEdge));//最终输出颜色的lerp值float lerpOut = sign(percentage - _ColorFactor);//最终颜色在原颜色和上一步计算的颜色之间差值(其实经过saturate(sign(..))的lerpOut应该只能是0或1)fixed3 colorOut = lerp(color, edgeColor, saturate(lerpOut));return fixed4(colorOut, 1);*/}ENDCGSubShader {Tags{"RenderType"="Opaque"}Pass{CGPROGRAM#pragma vertex vert#pragma fragment fragENDCG}}FallBack "Diffuse"
}

Unity Shader学习:Dissolve消融效果相关推荐

  1. Unity Shader学习:油画效果

    Unity Shader学习:油画效果 油画效果在学习浅墨大神的文章时看到的比较有趣,但是原文中也没详细的算法介绍如何实现,这里就先直接拿来用吧,UI和屏幕后处理都可以用,算法也看的不是很明白,好像是 ...

  2. Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)

    Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...

  3. Unity Shader学习:动态模糊(shutter angle方式)

    Unity Shader学习:动态模糊 动态模糊一般有帧混合和motion vector两种,这里主要介绍motion vector的方法. Keijiro源码:https://github.com/ ...

  4. Unity Shader学习:水墨效果

    Unity Shader学习:水墨效果 偶然在网上看到9级铁甲蛹大神的水墨风格后处理觉得挺有意思,参照着实现一下,还是涉及到之前油画效果的算法,叫什么滤波暂时不清楚,应该用来处理手绘效果挺多的. 水墨 ...

  5. 《Unity Shader入门精要》学习笔记第5章 开始Unity Shader学习之旅

    本文章用于帮助自己学习,因此只记录一些个人认为比较重要或者还不够熟悉的内容. 原作者:http://blog.csdn.net/candycat1992/article/ 第五章 开始Unity Sh ...

  6. Unity Shader 学习笔记(3)URP渲染管线带阴影PBR-Shader模板(ASE优化版本)

    此 Shader 已经不是最新版本,最新版本见本专栏的第四篇文章: Unity Shader 学习笔记(4) 材质面板截图: 功能实现(URP渲染管线下): PBR材质.投射和接收阴影. 代码展示: ...

  7. Unity Shader 学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染

    Unity Shader 学习笔记(27)渲染轮廓线(描边)方法.卡通风格渲染.素描风格渲染 参考书籍:<Unity Shader 入门精要> 渲染轮廓线(描边) 五种方法: 基于观察角度 ...

  8. Unity Shader学习:动态雾

    Unity Shader学习:动态雾 先将相机近裁面四个角向量传给shader,再通过观察空间下的深度值和相机位置算出像素在世界坐标系的位置,通过世界空间高度值来设定雾的范围和浓度,然后通过噪声和uv ...

  9. Unity Shader学习-高光反射

    Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...

最新文章

  1. Linux Centos 上一些常用的命令
  2. asp.Net Cookie demo
  3. 用phpmyadmin更改root密码的方法
  4. 如何在Chrome工具栏中固定和取消固定扩展程序
  5. 牛客题霸 [进制转换] C++题解/答案
  6. 国内互联网公司算法机器学习岗(阿里星)面试总结
  7. 关于application title一直是untitled的问题
  8. LeetCode MySQL 1369. 获取最近第二次的活动(over窗口函数)
  9. springboot17 集成SpringSecurity
  10. Appium原理分析
  11. 京东商城涉足电子书的醉翁之意
  12. python查询12306余票_使用 Python 在 12306 查询火车票余票
  13. Redhat 8修改系统语言为英文
  14. Tables[0].Rows.count什么意思?
  15. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java科研信息管理503pp
  16. MybatisPlus QueryWrapper(简称 QW,MP 封装的一个查询条件构造器)的使用和简单认识
  17. python3.9.0a3详细安装教程_Python 3.9.1图文安装教程(附安装包) | 我爱分享网
  18. png 微软ppt 透明度,教你一招永久搞定PPT导出高清图片的小技巧
  19. QTextBrowser显示图片(图片文字对齐)
  20. 一加5t升级 android p,第三方速度够快,一加1、一加5和一加5T火速升级AndroidP

热门文章

  1. 智能表单一键分发,快速收集信息
  2. Unity3D AI角色移动和自动跟随
  3. 360手机助手内部资料曝光,63张PPT纯干货
  4. java仿qq 界面_界面--仿qq登录界面
  5. 一起来学SpringBoot(十二)发送邮件
  6. 文件后缀名对应的Content-Type表
  7. potplayer录制视频、合并视频
  8. 20230402英语学习
  9. elscore.dll丢失怎么办?elscore.dll文件丢失电脑还能上网吗?
  10. 基于小波变换的单幅彩色图像去雾增强