Godot Shader特效:海面效果

2019-07-21  本文已影响0人  吃烧烤的老王

本文参照了Godot官方文档Shader部分的海洋案例,官方文档大家可以参看我的译文,官方文档的代码有一些BUG,导致无法编译运行,我按照自己的理解修改了一下。

效果图

海面效果

先附上代码

shader_type spatial;
render_mode diffuse_toon, specular_toon;

uniform sampler2D noise;

float wave(vec2 position){
    position += texture(noise, position / 10.0).x * 2.0 - 1.0;
    vec2 wv = 1.0 - abs(sin(position));
    return pow(1.0 - pow(wv.x * wv.y, 0.65), 4.0);
}

float height(vec2 position, float time) {
    float d = wave((position + time) * 0.4) * 0.3;
    d += wave((position - time) * 0.3) * 0.3;
    d += wave((position + time) * 0.5) * 0.2;
    d += wave((position - time) * 0.6) * 0.2;
    return d;
}

void vertex(){
    vec2 pos= VERTEX.xz;
    float k = height(pos, TIME);
    VERTEX.y = k;
    NORMAL = normalize(vec3(k - height(pos + vec2(0.1, 0.0), TIME), 0.1, k - height(pos + vec2(0.0, 0.1), TIME)));
}

void fragment(){
    float fresnel = sqrt(1.0 - dot(NORMAL, VIEW));
    RIM = 0.2;
    METALLIC = 0.0;
    ROUGHNESS = 0.01;
    ALBEDO = vec3(0.01, 0.03, 0.05);
}

其中 噪声纹理我并没有用Godot自带的OpenSimplexNoise,而是使用了一个在线纹理生成工具生成的,该网站也顺便推荐给各位Perlin Noise Maker

Perlin Noise Maker

未完待续

上一篇下一篇

猜你喜欢

热点阅读