UnityShader开发之死亡消融效果

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_28474981/article/details/96179559

UnityShader开发之死亡消融效果


在这里插入图片描述
https://blog.csdn.net/puppet_master/article/details/72455945
感谢大佬的文章启示,感觉理解不了就用自己的理解重新写了一下

1.问题解决思路

  1. 隐藏部分面片,并使其看起来不规则
  2. 使被隐藏的边缘面片的周围有一段颜色
  3. 将颜色分成两部分

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"
}

猜你喜欢

转载自blog.csdn.net/qq_28474981/article/details/96179559