水底气泡的 gdshader
来自 shadertoy 的代码
在这里,我添加了 x 方向和 y 方向上的 uv 位移
但是还是感觉太弱智
shader_type canvas_item;
// Created by greenbird10
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0
uniform float bubble_size = 0.1; // Size of the bubbles
uniform float upward_speed = 0.2; // Speed at which bubbles rise
uniform float movable_x = 0.0;
uniform float movable_y = 0.0;
float hash(vec2 p) {
return 0.5*(
sin(dot(p, vec2(271.319, 413.975)) + 1217.13*p.x*p.y)
) + 0.5;
}
float noise(vec2 p) {
vec2 w = fract(p);
w = w * w * (3.0 - 2.0*w);
p = floor(p);
return mix(
mix(hash(p+vec2(0,0)), hash(p+vec2(1,0)), w.x),
mix(hash(p+vec2(0,1)), hash(p+vec2(1,1)), w.x), w.y);
}
// wave octave inspiration
// Alexander Alekseev - Seascape
// https://www.shadertoy.com/view/Ms2SD1
float map_octave(vec2 uv) {
uv = (uv + noise(uv)) / 2.5;
uv = vec2(uv.x*0.6-uv.y*0.8, uv.x*0.8+uv.y*0.6);
vec2 uvsin = 1.0 - abs(sin(uv));
vec2 uvcos = abs(cos(uv));
uv = mix(uvsin, uvcos, uvsin);
float val = 1.0 - pow(uv.x * uv.y, 0.65);
return val;
}
float map(vec3 p) {
vec2 uv = p.xz + TIME/2.;
float amp = 0.6, freq = 2.0, val = 0.0;
for(int i = 0; i < 3; ++i) {
val += map_octave(uv) * amp;
amp *= 0.3;
uv *= freq;
// uv = vec2(uv.x*0.6-uv.y*0.8, uv.x*0.8+uv.y*0.6);
}
uv = p.xz - 1000. - TIME/2.;
amp = 0.6;
freq = 2.0;
for(int i = 0; i < 3; ++i) {
val += map_octave(uv) * amp;
amp *= 0.3;
uv *= freq;
// uv = vec2(uv.x*0.6-uv.y*0.8, uv.x*0.8+uv.y*0.6);
}
return val + 3.0 - p.y;
}
vec3 getNormal(vec3 p, vec2 resolution) {
float eps = 1./resolution.x;
vec3 px = p + vec3(eps, 0, 0);
vec3 pz = p + vec3(0, 0, eps);
return normalize(vec3(map(px),eps,map(pz)));
}
// raymarch inspiration
// Alexander Alekseev - Seascape
// https://www.shadertoy.com/view/Ms2SD1
float raymarch(vec3 ro, vec3 rd, vec2 resolution, out vec3 outP, out float outT) {
float l = 0., r = 26.;
int i = 0, steps = 16;
float dist = 1000000.;
for(int i = 0; i < steps; ++i) {
float mid = (r+l)/2.;
float mapmid = map(ro + rd*mid);
dist = min(dist, abs(mapmid));
if(mapmid > 0.) {
l = mid;
}
else {
r = mid;
}
if(r - l < 1./resolution.x) break;
}
outP = ro + rd*l;
outT = l;
return dist;
}
float fbm(vec2 n) {
float total = 0.0, amplitude = 1.0;
for (int i = 0; i < 5; i++) {
total += noise(n) * amplitude;
n += n;
amplitude *= 0.4;
}
return total;
}
float lightShafts(vec2 st) {
float angle = -0.2;

最低0.47元/天 解锁文章
1333

被折叠的 条评论
为什么被折叠?



