【unity Shader 菜鸡教程】练习2 角色死亡溶解效果
练习2要求角色溶解效果,带边缘光效果。
角色死亡溶解
额外做的一个劣质的冰冻效果
劣质冰冻效果
<hr/>要点:
clip
clip(dissolveTex.r - _Dissolve);
// clip(val)clip函数,当函数内的val小于0时,该片段的渲染会被舍弃掉。舍弃之后,就会看到溶解镂空的效果。
那这个镂空效果应该怎么处理呢。这里用了张噪声图 dissolveTex ,以及一个变量_Dissolve
噪声图
_Dissolve 的范围从0-1变化,通过 dissolveTex.r - _Dissolve,可以得到,从噪声图的黑色部分开始,逐渐向白色部分镂空(舍弃片段)。就可以得到溶剂效果。
smoothstep
smoothste 可以用来生成0到1的平滑过渡值,它也叫平滑阶梯函数
float smoothstep(float a, float b, float x)
{
x = clamp((x - a) / (b- a), 0.0, 1.0);
return x * x * (3 - 2 * x);
}当a<b 时。得到一条 a-b范围内朝向向上0~1 的平滑曲线。
这有什么用呢。这意味着取a/b两个数,可以通过这两个数来获取一个0~1的返回值,并且这个0~1的跨越宽度就是a/b两者之差。
fixed2 rampUV = smoothstep(_Dissolve,_Dissolve + _Width,dissolveTex.r);
fixed4 dissRamp = tex2D(_DissolveRamp,rampUV);rampUV得到的是0~1,作为纹理的uv采样值。那么这张纹理在显示上,它的宽度就是 _Width。
可能表达能力还是有问题,说得不清楚。可以结合参考的网址看看。
想着既然可以溶解,是不是也可以反过来,做一个渐显的效果。所以就有了类似冰冻效果的想法。
_UseIce(&#34;UseIce&#34;,int) = 0 // 定义变体对应的 勾选
......
#pragma multi_compile _ USE_ICE_TEX // USE_ICE_TEX变体名称
......
#if USE_ICE_TEX
// 如果勾选了,执行这个if 判断语句内
#else
// 否则,执行这里的逻辑
#endif
// 或者只要if
#if USE_ICE_TEX
#endif这里用来变体来判断使用溶解还是使用冰冻效果。
附上代码。
// 角色溶解
Shader &#34;Study/Chapter3/RoleDissolve&#34;
{
Properties
{
_MainTex (&#34;Texture&#34;, 2D) = &#34;white&#34; {}
_DissolveTex(&#34;DissTex&#34;,2D) = &#34;white&#34; {}
_Dissolve(&#34;DissolValue&#34;,Range(0,1.1)) = 0
_DissolveRamp(&#34;DissolRamp&#34;,2D) = &#34;white&#34; {}
_Width(&#34;Width&#34;,Range(0,0.15)) = 0.1
_UseIce(&#34;UseIce&#34;,int) = 0
_IceTex(&#34;IceTex&#34;,2D) = &#34;white&#34; {}
_IceVal(&#34;IceVal&#34;,Range(0,3)) = 1.2
}
SubShader
{
Tags { &#34;RenderType&#34;=&#34;Opaque&#34; }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ USE_ICE_TEX
#include &#34;UnityCG.cginc&#34;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float2 uv2 : TEXCOORD1;
};
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _DissolveTex;
float4 _DissolveTex_ST;
sampler2D _DissolveRamp;
sampler2D _IceTex;
float4 _IceTex_ST;
float _Dissolve;
float _Width;
float _IceVal;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);
o.uv.zw = TRANSFORM_TEX(v.uv, _DissolveTex);
#if USE_ICE_TEX
o.uv2 = TRANSFORM_TEX(v.uv, _IceTex);
#endif
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 mainTex = tex2D(_MainTex, i.uv.xy);
fixed4 dissolveTex = tex2D(_DissolveTex,i.uv.zw);
#if USE_ICE_TEX
#else
clip(dissolveTex.r - _Dissolve);
#endif
fixed4 col = fixed4(1,1,1,1);
#if USE_ICE_TEX
fixed4 iceTex = tex2D(_IceTex,i.uv2);
//dissolveTex.r <= _Dissolve 时返回1
// 噪音图,随着 _Dissolve 变大,从黑色部分出发, val 从 0->1 变化
fixed val = step(dissolveTex.r,_Dissolve);
// 随着 _Dissolve 变大 ,mainTex 主纹理的颜色逐渐变少-> mainTex * (1-val) = 0
// 颜色间常用 + 或者 * 来混合 来达到想要的效果
col =mainTex * (1-val) +val * (mainTex * (1-_IceVal) + iceTex * _IceVal) ;
#else
fixed2 rampUV = smoothstep(_Dissolve,_Dissolve + _Width,dissolveTex.r);
fixed4 dissRamp = tex2D(_DissolveRamp,rampUV);
col = mainTex + dissRamp;
#endif
return col;
}
ENDCG
}
}
}
打游戏很积极,写东西憋不出来.....不常写,不常用,不思考,东西就都忘了
工程:LZJian/UnityShaderCourse 目录:Chapter3 包括第三章的代码
参考:
smoothstep函数_SmoothStep是个啥?这是数学的魅力!_是Allen呀的博客-CSDN博客
风格化 + PBR - 恶毒的狗 | Bad Fat Dog
Unity中SmoothStep介绍和应用: 溶解特效优化
页:
[1]