This commit is contained in:
2024-07-29 15:51:58 +03:00
parent 33e75f8760
commit 83b935c968
4 changed files with 200 additions and 232 deletions

View File

@ -32,17 +32,16 @@ float noise(vec2 p, float scale )
hash( i + vec2(1.0,1.0) ), u.x), u.y);
}
float hash2( vec2 p ) {
float h = dot(p,vec2(127.1,311.7));
return fract(sin(h)*43758.5453123);
}
float noise2( in vec2 p ) {
vec2 i = floor( p ), f = fract( p ), u = f*f*(3.0-2.0*f);
return -1.0+2.0*mix( mix( hash( i + vec2(0.0,0.0) ),
hash( i + vec2(1.0,0.0) ), u.x),
mix( hash( i + vec2(0.0,1.0) ),
hash( i + vec2(1.0,1.0) ), u.x), u.y);
}
float displacement( vec3 p )
{
return noise(10.*p.xy+u_time+1e3, 0.2) + 0.5*noise(10.*(p.xy+2.0)-u_time+1e3, .2);
return -1.0+2.0*mix( mix( hash2( i + vec2(0.0,0.0) ),
hash2( i + vec2(1.0,0.0) ), u.x),
mix( hash2( i + vec2(0.0,1.0) ),
hash2( i + vec2(1.0,1.0) ), u.x), u.y);
}
/////////////////
@ -148,7 +147,7 @@ float sea_octave(vec2 uv, float choppy) {
return pow(1.0-pow(wv.x * wv.y,0.65),choppy);
}
vec2 map(vec3 p)
vec2 map(vec3 p, int displace)
{
float mat = 0.,
// Ring boxes
@ -219,26 +218,35 @@ vec2 map(vec3 p)
stepDist += .2;
}
if (d==d2) mat = 2.0;
d2 = (p.y + 4.25) + 1.5*noise((vec2((p.x*.04),(p.z-40.)*.04))+100., 15.);
// sand
d2 = (p.y + 4.25) + noise((vec2((p.x*.04),(p.z-40.)*.04))+100., 15.)*1.5;
d = min(d,d2);
if (d==d2) mat = 3.0;
d2 = 1e3;
float h = 0.0, d3, choppy=4., freq=0.6, amp=.2;
vec2 uv = p.xy;
for(int i = 0; i < 5; i++) {
d3 = sea_octave((uv+u_time)*freq,choppy);
d3 += sea_octave((uv-u_time)*freq,choppy);
h += d3 * amp;
uv *= mat2(1.6,1.2,-1.2,1.6); freq *= 1.9; amp *= 0.22;
choppy = mix(choppy,1.0,0.4);
}
d2 = max(-sdCappedCylinder(p, 2.0, clamp((2.0 - (u_time*2.0 - 2.0*23.0)),0.,2.0)), sdCappedCylinder(p, .025, 1.6) - h*0.15);
d2 = max(d2, sdCappedCylinder ( p, 0.3, 1.6));
if (displace == 1) {
vec2 uv = p.xy;
for(int i = 0; i < 4; i++) {
d3 = sea_octave((uv+u_time)*freq,choppy);
d3 += sea_octave((uv-u_time)*freq,choppy);
h += d3 * amp;
uv *= mat2(1.6,1.2,-1.2,1.6); freq *= 1.9; amp *= 0.22;
choppy = mix(choppy,1.0,0.4);
}
}
float cs = sdCappedCylinder(p, .025, 1.6) - h*0.15;
if (u_time < 25.) {
d2 = max(-sdCappedCylinder(p, 2.0, clamp((2.0 - (u_time*2.0 - 2.0*23.0)),0.,2.3)), cs);
} else {
d2 = cs;
}
d2 = max(d2, sdCappedCylinder ( p, 0.3, 1.7));
d = min(d, d2);
if (d==d2) mat = 1.0;
if (d==d2) mat = 1.0;
return vec2( d, mat );
}
@ -250,7 +258,7 @@ float rayMarch(vec3 ro, vec3 rd) {
float d,t = 0.; // total distance travelled
// Raymarching
for (int i = 0; i < 90; i++) {
d = map(ro + rd * t).x; // Get distance to objects
d = map(ro + rd * t, 0).x; // Get distance to objects
t += d; // "march" the ray
if (abs(d) < .002 || t > 400.) break;
}
@ -258,10 +266,10 @@ float rayMarch(vec3 ro, vec3 rd) {
}
vec3 getNormal(vec3 p) {
vec2 e = vec2(.01, 0.);
vec3 n = map(p).x - vec3(
map(p-e.xyy).x,
map(p-e.yxy).x,
map(p-e.yyx).x);
vec3 n = map(p, 1).x - vec3(
map(p-e.xyy,1).x,
map(p-e.yxy,1).x,
map(p-e.yyx,1).x);
return normalize(n);
}
@ -374,7 +382,7 @@ vec3 sceneGate(vec2 uv)
// Lighting
vec3 p = ro + rd * d,
n = getNormal(p);
float mat = map(p).y,
float mat = map(p,0).y,
// Light 1 Arguments
// 1: Ray starting point
@ -390,7 +398,7 @@ vec3 sceneGate(vec2 uv)
col += dif * light2Color;
// indirect lightning -> vec3 in normalize is light direction
col += indirColor * clamp( dot( getNormal(p), normalize(vec3(0. , 1., 10.))), 0., 1.);
col += indirColor * clamp( dot( n, normalize(vec3(0. , 1., 10.))), 0., 1.);
if(mat==0.)
col *= vec3(.3);