|
@@ -5,110 +5,116 @@ precision highp float;
|
|
|
varying vec2 vPosition;
|
|
|
varying vec2 vUV;
|
|
|
|
|
|
-uniform float ampScale;
|
|
|
-uniform float ringScale;
|
|
|
-uniform vec3 woodColor1;
|
|
|
-uniform vec3 woodColor2;
|
|
|
+vec3 hash(vec3 x)
|
|
|
+{
|
|
|
+ x = vec3(dot(x, vec3(127.1, 311.7, 74.7)),
|
|
|
+ dot(x, vec3(269.5, 183.3, 246.1)),
|
|
|
+ dot(x, vec3(113.5, 271.9, 124.6)));
|
|
|
|
|
|
-
|
|
|
-float rand(vec2 n) {
|
|
|
- return fract(cos(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);
|
|
|
+ return fract(sin(x)*43758.5453123);
|
|
|
}
|
|
|
|
|
|
-float noise(vec2 n) {
|
|
|
- const vec2 d = vec2(0.0, 1.0);
|
|
|
- vec2 b = floor(n), f = smoothstep(vec2(0.0), vec2(1.0), fract(n));
|
|
|
- return mix(mix(rand(b), rand(b + d.yx), f.x), mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y);
|
|
|
-}
|
|
|
+// returns closest, second closest, and cell id
|
|
|
+vec3 voronoi(in vec3 x)
|
|
|
+{
|
|
|
+ vec3 p = floor(x);
|
|
|
+ vec3 f = fract(x);
|
|
|
+
|
|
|
+ float id = 0.0;
|
|
|
+ vec2 res = vec2(100.0);
|
|
|
+ for (int k = -1; k <= 1; k++)
|
|
|
+ for (int j = -1; j <= 1; j++)
|
|
|
+ for (int i = -1; i <= 1; i++)
|
|
|
+ {
|
|
|
+ vec3 b = vec3(float(i), float(j), float(k));
|
|
|
+ vec3 r = vec3(b) - f + hash(p + b);
|
|
|
+ float d = dot(r, r);
|
|
|
+
|
|
|
+ if (d < res.x)
|
|
|
+ {
|
|
|
+ id = dot(p + b, vec3(1.0, 57.0, 113.0));
|
|
|
+ res = vec2(d, res.x);
|
|
|
+ }
|
|
|
+ else if (d < res.y)
|
|
|
+ {
|
|
|
+ res.y = d;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
-float fbm(vec2 n) {
|
|
|
- float total = 0.0, amplitude = 1.0;
|
|
|
- for (int i = 0; i < 4; i++) {
|
|
|
- total += noise(n) * amplitude;
|
|
|
- n += n;
|
|
|
- amplitude *= 0.5;
|
|
|
- }
|
|
|
- return total;
|
|
|
+ return vec3(sqrt(res), abs(id));
|
|
|
}
|
|
|
|
|
|
+const mat3 m = mat3(0.00, 0.80, 0.60,
|
|
|
+ -0.80, 0.36, -0.48,
|
|
|
+ -0.60, -0.48, 0.64);
|
|
|
+
|
|
|
+void main(void)
|
|
|
+{
|
|
|
+ vec2 p = vUV;
|
|
|
+
|
|
|
+ // camera movement
|
|
|
+ float an = 0.5*0.1;
|
|
|
+ vec3 ro = vec3(2.5*cos(an), 1.0, 2.5*sin(an));
|
|
|
+ vec3 ta = vec3(0.0, 1.0, 0.0);
|
|
|
+ // camera matrix
|
|
|
+ vec3 ww = normalize(ta - ro);
|
|
|
+ vec3 uu = normalize(cross(ww, vec3(0.0, 1.0, 0.0)));
|
|
|
+ vec3 vv = normalize(cross(uu, ww));
|
|
|
+ // create view ray
|
|
|
+ vec3 rd = normalize(p.x*uu + p.y*vv + 1.5*ww);
|
|
|
+
|
|
|
+ // sphere center
|
|
|
+ vec3 sc = vec3(0.0, 1.0, 0.0);
|
|
|
+
|
|
|
+ // raytrace
|
|
|
+ float tmin = 10000.0;
|
|
|
+ vec3 nor = vec3(0.0);
|
|
|
+ float occ = 1.0;
|
|
|
+ vec3 pos = vec3(0.0);
|
|
|
+
|
|
|
+ // raytrace-plane
|
|
|
+ float h = (0.0 - ro.y) / rd.y;
|
|
|
+ if (h>0.0)
|
|
|
+ {
|
|
|
+ tmin = h;
|
|
|
+ nor = vec3(0.0, 1.0, 0.0);
|
|
|
+ pos = ro + h*rd;
|
|
|
+ vec3 di = sc - pos;
|
|
|
+ float l = length(di);
|
|
|
+ occ = 1.0 - dot(nor, di / l)*1.0*1.0 / (l*l);
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
-void main(void) {
|
|
|
-
|
|
|
-
|
|
|
- /*vec3 rock = vec3(0.53, 0.53, 0.53);
|
|
|
- vec3 roll = vec3(0.18, 0.18, 0.18);
|
|
|
-
|
|
|
- float ratioy = mod(vUV.y * 50.0, fbm(vUV * 8.0));
|
|
|
-
|
|
|
- rock = rock * ratioy;
|
|
|
- roll = roll * ratioy;
|
|
|
-
|
|
|
- vec3 stone = mix(rock, roll, 0.5);
|
|
|
-
|
|
|
-
|
|
|
- gl_FragColor = vec4(stone, 1.0);*/
|
|
|
-
|
|
|
-
|
|
|
- /* voronoi.frag */
|
|
|
-
|
|
|
-
|
|
|
- vec2 seeds[16];
|
|
|
- vec3 colors[16];
|
|
|
-
|
|
|
- colors[0] = vec3(0.53, 0.53, 0.53);
|
|
|
- colors[1] = vec3(0.28, 0.28, 0.28);
|
|
|
- colors[2] = vec3(0.23, 0.23, 0.23);
|
|
|
- colors[3] = vec3(0.38, 0.38, 0.38);
|
|
|
- colors[4] = vec3(0.63, 0.63, 0.63);
|
|
|
- colors[5] = vec3(0.78, 0.78, 0.78);
|
|
|
- colors[6] = vec3(0.93, 0.93, 0.93);
|
|
|
- colors[7] = vec3(0.73, 0.73, 0.73);
|
|
|
- colors[8] = vec3(0.43, 0.43, 0.43);
|
|
|
- colors[9] = vec3(0.11, 0.11, 0.11);
|
|
|
- colors[10] = vec3(0.12, 0.12, 0.12);
|
|
|
- colors[11] = vec3(0.64, 0.64, 0.64);
|
|
|
- colors[12] = vec3(0.79, 0.79, 0.79);
|
|
|
- colors[13] = vec3(0.43, 0.43, 0.43);
|
|
|
- colors[14] = vec3(0.21, 0.21, 0.21);
|
|
|
- colors[15] = vec3(0.37, 0.37, 0.37);
|
|
|
-
|
|
|
- seeds[0] = vec2(0.1, 0.9);
|
|
|
- seeds[1] = vec2(0.2, 0.8);
|
|
|
- seeds[2] = vec2(0.3, 0.7);
|
|
|
- seeds[3] = vec2(0.4, 0.4);
|
|
|
- seeds[4] = vec2(0.5, 0.5);
|
|
|
- seeds[5] = vec2(0.6, 0.3);
|
|
|
- seeds[6] = vec2(0.7, 0.2);
|
|
|
- seeds[7] = vec2(0.8, 0.3);
|
|
|
- seeds[8] = vec2(0.9, 0.4);
|
|
|
- seeds[9] = vec2(1.0, 0.3);
|
|
|
- seeds[10] = vec2(0.5, 0.4);
|
|
|
- seeds[11] = vec2(0.7, 0.8);
|
|
|
- seeds[12] = vec2(0.5, 0.3);
|
|
|
- seeds[13] = vec2(0.7, 0.7);
|
|
|
- seeds[14] = vec2(0.3, 0.3);
|
|
|
- seeds[15] = vec2(0.7, 0.7);
|
|
|
-
|
|
|
- float dist = distance(seeds[0], vPosition);
|
|
|
- vec3 color = colors[0];
|
|
|
-
|
|
|
- float hotpoint = 1.0;
|
|
|
- float current = 1.0;
|
|
|
- for (int i = 1; i < 16; i++) {
|
|
|
- current = distance(seeds[i], vPosition);
|
|
|
- if (current < dist) {
|
|
|
- hotpoint++;
|
|
|
- color = colors[i];
|
|
|
- dist = current;
|
|
|
+ // raytrace-sphere
|
|
|
+ vec3 ce = ro - sc;
|
|
|
+ float b = dot(rd, ce);
|
|
|
+ float c = dot(ce, ce) - 1.0;
|
|
|
+ h = b*b - c;
|
|
|
+ if (h>0.0)
|
|
|
+ {
|
|
|
+ h = -b - sqrt(h);
|
|
|
+ if (h<tmin)
|
|
|
+ {
|
|
|
+ tmin = h;
|
|
|
+ nor = normalize(ro + h*rd - sc);
|
|
|
+ occ = 0.5 + 0.5*nor.y;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (hotpoint > 3.0)
|
|
|
- color = mix(vec3(0.39, 0.32, 0), color, 1.0 / hotpoint);
|
|
|
+ // shading/lighting
|
|
|
+ vec3 col = vec3(0.9);
|
|
|
+ if (tmin<100.0)
|
|
|
+ {
|
|
|
+ pos = ro + tmin*rd;
|
|
|
+
|
|
|
+ float f = voronoi(4.0*pos).x;
|
|
|
|
|
|
- gl_FragColor = vec4(color, 1.0);
|
|
|
+ f *= occ;
|
|
|
+ col = vec3(f*1.2);
|
|
|
+ col = mix(col, vec3(0.9), 1.0 - exp(-0.003*tmin*tmin));
|
|
|
+ }
|
|
|
|
|
|
+ col = sqrt(col);
|
|
|
|
|
|
|
|
|
+ gl_FragColor = vec4(col, 1.0);
|
|
|
}
|