流光效果
第一种 UV偏移,缺点是需要依据max中展UV的结果,要想统一,需要二套UV,跟采样的流光贴图方向有关系
优点是依据UV的话,可通过调整UV实现可快可慢的局部效果
i.uv + half2(_SpeedX, _SpeedY) * _Time.y;
第二种是通过偏移世界空间顶点,作为流光图的UV采样,优点是不受模型影响
uv = i.worldPos.xy * _Factor.zw + _Factor.xy * _Time.y;
fixed4 flash = tex2D(_UVTex, uv) * _UVColor * _UVTexStrength;
从一个方向溶解效果
第一种模型空间点作为clip依据,也可用屏幕空间,世界空间来做 ,得到不同结果
clip(i.objPos.xyz - _DissolveVector.xyz);
第二种溶解边缘线发光
//沿模型空间顶点裁剪
float factor = i.objPos.x - _DissolveThreshold;
clip(factor);
//差值分离出一块区域
fixed lerpFactor = saturate(sign(_ColorFactor - factor));
return lerpFactor * _DissolveColor + (1 - lerpFactor) * fixed4(color, 1);
第三种在溶解基础上用噪声图产生随机效果
fixed4 dissolve = tex2D(_DissolveMap, i.uv);
float factor = i.objPos.x - _DissolveControl;
if(factor < 0)
{
clip(_DissolveThreshold - dissolve.r * abs(factor) * _DissolveSpeedFactor);
}
return fixed4(color, 1);
随机溶解效果:
if版本
//采样Dissolve Map
fixed4 dissolveValue = tex2D(_DissolveMap, i.uv);
//小于阈值的部分直接discard
if (dissolveValue.r < _DissolveThreshold)
{
discard;
}
//这里为了比较方便,直接用color和最终的边缘lerp了
float lerpValue = _DissolveThreshold / dissolveValue.r;
if (lerpValue > _ColorFactorA)
{
if (lerpValue > _ColorFactorB)
return _DissolveColorB;
return _DissolveColorA;
}
优化版本
float percentage = _DissolveThreshold / dissolveValue.r;
//如果当前百分比 - 颜色权重 - 边缘颜色
float lerpEdge = sign(percentage - _ColorFactor - _DissolveEdge);
//貌似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));