版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
https://blog.csdn.net/puppet_master/article/details/72455945
感谢大佬的文章启示,感觉理解不了就用自己的理解重新写了一下
1.问题解决思路
- 隐藏部分面片,并使其看起来不规则
- 使被隐藏的边缘面片的周围有一段颜色
- 将颜色分成两部分
2.算法
1.使用噪声图,通过阈值进行裁剪,小于该阈值的就不做显示
2.通过边缘颜色步长获取要显示燃烧颜色的阈值,然后通过颜色百分比来调整红色和橙色的占比
3.代码
Shader "Unlit/Dissolve"
{
Properties{
_DissolveColor("Dissolve Color", Color) = (0,0,0,0)
_DissolveEdgeColor("Dissolve Edge Color", Color) = (1,1,1,1)
_MainTex("Base 2D", 2D) = "white"{}
_NoiseMap("NoiseMap", 2D) = "white"{}
_DissolveThreshold("DissolveThreshold", Range(0,1)) = 0
_EdgeColorStep("EdgeColorStep", Range(0,1)) = 0.05
_EdgeColorPencent("EdgeColorPencent", Range(0,1)) = 0.2
}
SubShader
{
Tags{ "RenderType" = "Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
uniform fixed4 _DissolveColor;
uniform fixed4 _DissolveEdgeColor;
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform sampler2D _NoiseMap;
uniform float _DissolveThreshold;
uniform float _EdgeColorStep;
uniform float _EdgeColorPencent;
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float2 uv : TEXCOORD1;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.pos=o.pos;
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
//采样Dissolve Map
fixed4 dissolveValue = tex2D(_NoiseMap, i.uv);
//小于阈值的部分直接discard
if (dissolveValue.r < _DissolveThreshold)
{
discard;
}
fixed3 color = tex2D(_MainTex, i.uv).rgb ;
float offset = dissolveValue.r-_DissolveThreshold;
float edgePercent=step(0,_EdgeColorStep-offset);
float mainPercent=step(_EdgeColorStep-offset,0);
float lerpValue=lerp(_DissolveThreshold,_DissolveThreshold+_EdgeColorStep,_EdgeColorPencent);
float edgeSubPercent=step(lerpValue,dissolveValue.r);
color=mainPercent*color+edgePercent*((1-edgeSubPercent)*_DissolveColor+_DissolveEdgeColor*edgeSubPercent);
return fixed4(color, 1);
}
ENDCG
}
}
FallBack "Diffuse"
}