- Sign In
- Sign Up
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); }
xxxxxxxxxx
precision highp float;
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);
}
90 fps 16ms
00:00:00.35
0.00