流光与溶解

流光效果
第一种 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));

你可能感兴趣的:(流光与溶解)