// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Unlit/DissolveEffect" { Properties{ _Diffuse("Diffuse", Color) = (1,1,1,1) _DissolveColor("Dissolve Color", Color) = (0,0,0,0) _DissolveEdgeColor("Dissolve Edge Color", Color) = (1,1,1,1) _MainTex("Texture", 2D) = "white" {} _DissolveMap("DissolveMap", 2D) = "white"{} _DissolveThreshold("DissolveThreshold", Range(0,1)) = 0 _ColorFactor("ColorFactor", Range(0,1)) = 0.7 _DissolveEdge("DissolveEdge", Range(0,1)) = 0.8 } CGINCLUDE #include "Lighting.cginc" uniform fixed4 _Diffuse; uniform fixed4 _DissolveColor; uniform fixed4 _DissolveEdgeColor; uniform sampler2D _MainTex; uniform float4 _MainTex_ST; uniform sampler2D _DissolveMap; uniform fixed _DissolveThreshold; uniform fixed _ColorFactor; uniform fixed _DissolveEdge; struct v2f { half4 pos : SV_POSITION; // half3 worldNormal : TEXCOORD0; half2 uv : TEXCOORD1; }; v2f vert(appdata_base v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); 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(_DissolveMap, i.uv); //小于阈值的部分直接discard if (dissolveValue.r < _DissolveThreshold) { discard; } //Diffuse + Ambient光照计算 //fixed3 worldNormal = normalize(i.worldNormal); //fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz); //fixed3 lambert = saturate(dot(worldNormal, worldLightDir)); // fixed3 albedo = lambert * _Diffuse.xyz * _LightColor0.xyz + UNITY_LIGHTMODEL_AMBIENT.xyz; fixed3 color = tex2D(_MainTex, i.uv).rgb; //* albedo; //优化版本,尽量不在shader中用分支判断的版本,但是代码很难理解啊.... fixed percentage = _DissolveThreshold / dissolveValue.r; //如果当前百分比 - 颜色权重 - 边缘颜色 fixed lerpEdge = sign(percentage - _ColorFactor - _DissolveEdge); //貌似sign返回的值还得saturate一下,否则是一个很奇怪的值 fixed3 edgeColor = lerp(_DissolveEdgeColor.rgb, _DissolveColor.rgb, saturate(lerpEdge)); //最终输出颜色的lerp值 fixed lerpOut = sign(percentage - _ColorFactor); //最终颜色在原颜色和上一步计算的颜色之间差值(其实经过saturate(sign(..))的lerpOut应该只能是0或1) fixed3 colorOut = lerp(color, edgeColor, saturate(lerpOut)); return fixed4(colorOut, 1); } ENDCG SubShader { Tags{ "RenderType" = "Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag ENDCG } } //FallBack "Diffuse" }