The Code Therapy

raymarching test

raymarching test yay hooray cool

Created by purplejragon on Sun, 08 May 2022 23:19:38 GMT.


precision highp float;

#define MAX_STEPS 100
#define MAX_DIST 100.0
#define INF 1000000.0

uniform vec2 resolution;
uniform vec2 mouse;
uniform float time;

float sdSphere(vec3 p, float r) {
  return max(0.0, length(p) - r);
}
float sdBox(vec3 p, vec3 b) {
  vec3 q = abs(p) - b;
  return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0);
}
float sdCross(vec3 p) {
  float da = sdBox(p.xyz,vec3(INF,1.0,1.0));
  float db = sdBox(p.yzx,vec3(1.0,INF,1.0));
  float dc = sdBox(p.zxy,vec3(1.0,1.0,INF));
  return min(da,min(db,dc));
}

float map(in vec3 p) {
  /*
  vec3 m = vec3(1.0, 0.5, 1.0);
  p = mod(vec3(0.0) - p, m) - m / 2.0;
  return sphere(p);
  */
  float box = sdBox(p, vec3(1.0));
  float cr = sdCross(p*3.0)/3.0;
  return max(box, -cr);
}

float raymarch(vec3 ro, vec3 rd, out float st) {
  float t = 0.0;
  int s = 0;
  for (int i = 0; i < MAX_STEPS; i++) {
    s = i;
    vec3 p = ro + rd * t;
    float d = map(p);
    t += d;
    if (t > MAX_DIST || d < 0.001) break;
  }
  st =  1.0 - float(s) / float(MAX_STEPS);
  return t;
}

void main() {
  vec3 ro = vec3(cos(mouse.x*3.0+time/5.0)*3.0, 0.0, sin(mouse.x*3.0+time/5.0)*3.0);
  vec2 px = gl_FragCoord.xy;
  vec2 uv = (px - 0.5 * resolution) / resolution.y;
  vec3 rd = normalize(vec3(uv, -1.0));
  float st = 0.0;
  float t = raymarch(ro, rd, st);

  vec3 color = t / 9.0 * vec3(1.0);
  //vec3 color = vec3(rd);

  gl_FragColor = vec4(color, 1.0);
}