本文参照了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
未完待续
网友评论