tunneli vege, vettä tilalle
This commit is contained in:
144
shader.glsl
144
shader.glsl
@ -32,6 +32,14 @@ float noise(vec2 p, float scale )
|
||||
hash( i + vec2(1.0,1.0) ), u.x), u.y);
|
||||
}
|
||||
|
||||
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);
|
||||
@ -93,7 +101,10 @@ fogColor2 = vec3(.7, .4, .2), // fog color2
|
||||
indirColor = vec3(.2, .1, .3), // indirect light color
|
||||
light1Color = vec3(.9, .5, .7),
|
||||
light2Color = vec3(.8, .7, .5),
|
||||
chevronColor = vec3(.9, .3, 0.);
|
||||
chevronColor = vec3(.9, .3, 0.),
|
||||
SEA_BASE = vec3(0.0, 0.1, 0.2),
|
||||
SEA_WATER_COLOR =vec3(0.8,0.9,0.6)*0.6;
|
||||
|
||||
|
||||
// with duration d, startTime s and speed up with timeFact
|
||||
float timedSine(vec3 i) {
|
||||
@ -129,6 +140,13 @@ float prismAnim(vec2 i) {
|
||||
//////////////
|
||||
// SCENE //
|
||||
//////////////
|
||||
float sea_octave(vec2 uv, float choppy) {
|
||||
uv += noise2(uv);
|
||||
vec2 wv = 1.0-abs(sin(uv));
|
||||
vec2 swv = abs(cos(uv));
|
||||
wv = mix(wv,swv,wv);
|
||||
return pow(1.0-pow(wv.x * wv.y,0.65),choppy);
|
||||
}
|
||||
|
||||
vec2 map(vec3 p)
|
||||
{
|
||||
@ -206,8 +224,18 @@ vec2 map(vec3 p)
|
||||
d = min(d,d2);
|
||||
if (d==d2) mat = 3.0;
|
||||
|
||||
d2 = 1e3;
|
||||
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)+ displacement(p)*clamp(((u_time-24.0)*0.5), 0., 0.25));
|
||||
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));
|
||||
d = min(d, d2);
|
||||
if (d==d2) mat = 1.0;
|
||||
@ -237,14 +265,35 @@ vec3 getNormal(vec3 p) {
|
||||
return normalize(n);
|
||||
}
|
||||
|
||||
float getLight(vec3 p, vec3 lightPos, float intensity, float shadow) {
|
||||
vec3 l = normalize(lightPos - p), n = getNormal(p);
|
||||
float getLight(vec3 p, vec3 lightPos, float intensity, float shadow, vec3 n) {
|
||||
vec3 l = normalize(lightPos - p);
|
||||
float dif = clamp(dot(n, l), 0., intensity),
|
||||
d = rayMarch(p+n*.0025, l);
|
||||
if(abs(d)<length(lightPos-p)) dif *= shadow;
|
||||
return dif;
|
||||
}
|
||||
|
||||
// lighting
|
||||
float diffuse(vec3 n,vec3 l,float p) {
|
||||
return pow(dot(n,l) * 0.4 + 0.6,p);
|
||||
}
|
||||
|
||||
float specular(vec3 normal,vec3 lightPos,vec3 rayOrigin,float specular) {
|
||||
float nrm = (specular + 8.0) / (PI * 8.0);
|
||||
return pow(max(dot(reflect(rayOrigin,normal),lightPos),0.0),specular) * nrm;
|
||||
}
|
||||
|
||||
vec3 getSeaColor(vec3 p, vec3 n, vec3 l, vec3 eye) {
|
||||
float fresnel = clamp(1.0 - dot(n,-eye), 0.0, 1.0);
|
||||
fresnel = min(pow(fresnel,5.0), 0.5);
|
||||
vec3 reflected = vec3(0.0, 0.5, 1.),
|
||||
refracted = SEA_BASE + diffuse(n,l,60.0) * SEA_WATER_COLOR * 0.3,
|
||||
color = mix(refracted,reflected,fresnel);
|
||||
color += vec3(specular(n,l,eye,60.0))*0.3;
|
||||
return color;
|
||||
}
|
||||
|
||||
|
||||
vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float b ) {
|
||||
vec3 fogColor = mix( fogColor1, // blue
|
||||
fogColor2, // yellow
|
||||
@ -323,9 +372,10 @@ vec3 sceneGate(vec2 uv)
|
||||
|
||||
if (d < 150.) {
|
||||
// Lighting
|
||||
vec3 p = ro + rd * d;
|
||||
vec3 p = ro + rd * d,
|
||||
n = getNormal(p);
|
||||
float mat = map(p).y,
|
||||
|
||||
|
||||
// Light 1 Arguments
|
||||
// 1: Ray starting point
|
||||
// 2: Light position
|
||||
@ -333,10 +383,10 @@ vec3 sceneGate(vec2 uv)
|
||||
// 4: Shadow intensity
|
||||
|
||||
// Light 2
|
||||
dif = getLight(p, vec3( 10., 15., 25.), 1., .2);
|
||||
dif = getLight(p, vec3( 10., 15., 25.), 1., .2,n);
|
||||
col += dif * light1Color;
|
||||
|
||||
dif = getLight(p, vec3( 4., 2., -15.), 1., 1.);
|
||||
dif = getLight(p, vec3( 4., 2., -15.), 1., 1.,n);
|
||||
col += dif * light2Color;
|
||||
|
||||
// indirect lightning -> vec3 in normalize is light direction
|
||||
@ -344,8 +394,9 @@ vec3 sceneGate(vec2 uv)
|
||||
|
||||
if(mat==0.)
|
||||
col *= vec3(.3);
|
||||
else if(mat==1.)
|
||||
col *= vec3(0.,0.,.5); // + (noise(5.*(p.xy+2.)+u_time, -1.0) * noise(50.*(p.xy+2.), -0.4) + 0.5*noise(20.*(p.xy+2.0)-u_time, -0.5) * noise(5.*(p.xy+2.0), -0.75))*smoothstep(0.,0.75,(u_time-5.0)*0.1) + vec3(0.,0.,0.5*noise(10.*(p.xy+4.0)-u_time, -0.5));
|
||||
else if(mat==1.){
|
||||
col = getSeaColor(p, n, normalize(vec3(0.0,0.3,0.8)),normalize(rd)); //col = vec3(0.,0.,.5); // + (noise(5.*(p.xy+2.)+u_time, -1.0) * noise(50.*(p.xy+2.), -0.4) + 0.5*noise(20.*(p.xy+2.0)-u_time, -0.5) * noise(5.*(p.xy+2.0), -0.75))*smoothstep(0.,0.75,(u_time-5.0)*0.1) + vec3(0.,0.,0.5*noise(10.*(p.xy+4.0)-u_time, -0.5));
|
||||
}
|
||||
else if(mat==2.)
|
||||
col *= vec3(.3, .1, .0); // - 0.2*noise((vec2(100.*p.x+300.,75.*p.z+150.0)), -2.2) * noise((vec2(15.*p.x+2.0,3.*p.z+2.)), -1.) + noise((vec2(15.*p.x+2.4,3.*p.z+2.)), -0.25);
|
||||
else if(mat==3.)
|
||||
@ -361,72 +412,7 @@ vec3 sceneGate(vec2 uv)
|
||||
return postProcess(col);
|
||||
}
|
||||
|
||||
void pMod1(inout float p, float size) {
|
||||
p = mod(p + size*0.5, size) - size*0.5;
|
||||
}
|
||||
|
||||
void getQ(inout vec3 q, float i, float speed, float radius) {
|
||||
q.z -= .5;
|
||||
q.xy *= rot2D(sin(speed*u_time*.25)*PI);
|
||||
q.x -= radius * sin(i / PI);
|
||||
q.y -= radius * cos(i / PI);
|
||||
q.z += i * .01;
|
||||
}
|
||||
|
||||
vec2 map2(vec3 pos) {
|
||||
float d = 1e3, mat;
|
||||
pMod1(pos.z, 1.);
|
||||
for (float i = 0.; i < 90.; i++) {
|
||||
vec3 q = pos;
|
||||
getQ(q, i, -1., 3.);
|
||||
float b = sdSphere(q, 0.05);
|
||||
d = min(d, b);
|
||||
if (d == b) mat = 0.;
|
||||
q = pos;
|
||||
getQ(q, i, 1., .3);
|
||||
b = sdSphere(q, 0.01);
|
||||
d = min(d, b);
|
||||
if (d == b) mat = 1.;
|
||||
}
|
||||
return vec2(d, mat);
|
||||
}
|
||||
|
||||
vec3 palette(float t) {
|
||||
vec3 a = vec3(0.5, 0.5, 0.5),
|
||||
b = vec3(1.0, 1.0, 1.0),
|
||||
c = vec3(1.0, 1.0, 1.0),
|
||||
d = vec3(0.0, 0.66, 0.33);
|
||||
return a + b * cos(6.3 * (c*t+d));
|
||||
}
|
||||
|
||||
float rayMarch2(vec3 ro, vec3 rd) {
|
||||
float t = 0.,d;
|
||||
for (int i = 0; i < 60; i++) {
|
||||
d = map2(ro + rd * t).x;
|
||||
t += d;
|
||||
if (d < .002 || t > 20.) break;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
vec3 sceneTunnel(vec2 uv) {
|
||||
vec3 ro = vec3(0.,0.,u_time*2. ),
|
||||
col = vec3(0., 0., .1),
|
||||
rd = normalize(vec3(uv, .7));
|
||||
float d = rayMarch2(ro, rd),
|
||||
mat = map2( ro + rd * d).y;
|
||||
if (d < 10.) {
|
||||
if (mat == 0.) col = vec3( 0., .3, .6);
|
||||
if (mat == 1.) col = palette(1. - .4*d);
|
||||
}
|
||||
return col;
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec2 uv = (gl_FragCoord.xy * 2. - u_resolution.xy) / u_resolution.y;
|
||||
if (u_time < 29.) {
|
||||
gl_FragColor = vec4(sceneGate(uv), 1.);
|
||||
} else {
|
||||
gl_FragColor = vec4(sceneTunnel(uv), 1.);
|
||||
}
|
||||
void main() {
|
||||
vec2 uv = (gl_FragCoord.xy * 2. - u_resolution.xy) / u_resolution.y;
|
||||
gl_FragColor = vec4(sceneGate(uv), 1.);
|
||||
}
|
||||
Reference in New Issue
Block a user