Godot Shader特效:溶解效果(改进版)

结合网上Unity Shader特效的一些教程,将之前的溶解效果Godot Shader特效:溶解效果(第一版)改进了一下。
改进点:

  • 可以在GDScript代码中控制溶解的进度,不用总是循环了。
  • 可以自定义溶解的过渡色。
  • 优化了溶解过渡色的生成算法,使用颜色叠加的方式,比之前的效果好了不少

效果如下

溶解效果(改进版)

代码如下

shader_type canvas_item;
uniform sampler2D noise;
uniform float threshold = 0.1f;
uniform float fadeout = 0.0;
uniform vec4  inter_color = vec4(1.,0.,0.,1.);

void fragment(){
    vec4 color = texture(TEXTURE,UV);
    vec4 n = texture(noise,UV);
    if(color.a > 0.0){
        float diff = n.r - fadeout;
        if(diff > threshold){
            color.a = 0.0;
        }else if(diff < threshold && diff > 0.0){
            float a = n.r*diff/threshold;
            color = color * (1.0- a) + inter_color * a;
        }
    }
    COLOR = color;
}

原理

大体思路和之前的版本类似,只不过最关键的优化了过渡色的生成算法,如下所示:

      float a = n.r*diff/threshold;
      color = color * (1.0- a) + inter_color * a;

用Shader的bulit-in函数再改进一下:
mix函数替代color * (1.0- a) + inter_color * a

shader_type canvas_item;
uniform sampler2D noise;
uniform float threshold = 0.1f;
uniform float fadeout = 0.0;
uniform vec4  inter_color = vec4(1.,0.,0.,1.);

void fragment(){
    vec4 color = texture(TEXTURE,UV);
    vec4 n = texture(noise,UV);
    if(color.a > 0.0){
        float diff = n.r - fadeout;
        if(diff > threshold){
            color.a = 0.0;
        }else if(diff < threshold && diff > 0.0){
            float a = n.r*diff/threshold;
            //color = color * (1.0- a) + inter_color * a;
            color = mix(inter_color,color,a);
        }
    }
    COLOR = color;
}

小结
这个特效可以用于水溶,火烧,隐身等效果的实现

你可能感兴趣的:(Godot Shader特效:溶解效果(改进版))