结合网上Unity Shader特效的一些教程,将之前的溶解效果Godot Shader特效:溶解效果(第一版)改进了一下。
改进点:
- 可以在GDScript代码中控制溶解的进度,不用总是循环了。
- 可以自定义溶解的过渡色。
- 优化了溶解过渡色的生成算法,使用颜色叠加的方式,比之前的效果好了不少
效果如下
![](https://img.haomeiwen.com/i17230965/31405202eb990277.gif)
代码如下
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;
}
小结
这个特效可以用于水溶,火烧,隐身等效果的实现
网友评论