Skip to content

Instantly share code, notes, and snippets.

@Gitmoko
Created January 9, 2018 23:53
Show Gist options
  • Save Gitmoko/9f6bdc74c0424336312b42e7b752a9a3 to your computer and use it in GitHub Desktop.
Save Gitmoko/9f6bdc74c0424336312b42e7b752a9a3 to your computer and use it in GitHub Desktop.
#ifdef GL_ES
precision mediump float;
#endif
#extension GL_OES_standard_derivatives : enable
uniform vec2 resolution;
uniform vec2 mouse;
uniform float time;
#define DIST_COEFF 1.
#define DIST_MIN 0.01
#define DIST_MAX 1000.
#define ITE_MAX 100.
#define PI 3.141592
mat3 rotM(vec3 axis,float angle){
axis = normalize(axis);
float s = sin(angle);
float c = cos(angle);
float oc = 1.0 - c;
return mat3(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s,
oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s,
oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c);}
vec3 GenRay(vec3 dir,vec3 up,float angle){
vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
vec3 u = normalize(cross(up, dir));
vec3 v = normalize(cross(dir, u));
float fov = angle * PI * 0.5 / 180.;
return normalize(sin(fov) * u * p.x + sin(fov) * v * p.y + cos(fov) * dir);}
float Tunnel(vec3 p){
float d = max((length((p-vec3(0.,0.,0.)).xz-vec2(0.,0.))-4.),-(length((p-vec3(0.,0.,0.)).xz-vec2(0.,0.))-3.9));
return d;
}
float Cross(vec3 p){
float d = min(min(min(max((abs(p-vec3(0.,0.,0.)) - vec3(100.,1.,1.)).x, max((abs(p-vec3(0.,0.,0.)) - vec3(100.,1.,1.)).y, (abs(p-vec3(0.,0.,0.)) - vec3(100.,1.,1.)).z)), 0.0) + length(max((abs(p-vec3(0.,0.,0.)) - vec3(100.,1.,1.)), 0.0)),min(max((abs(p-vec3(0.,0.,0.)) - vec3(1.,100.,1.)).x, max((abs(p-vec3(0.,0.,0.)) - vec3(1.,100.,1.)).y, (abs(p-vec3(0.,0.,0.)) - vec3(1.,100.,1.)).z)), 0.0) + length(max((abs(p-vec3(0.,0.,0.)) - vec3(1.,100.,1.)), 0.0))),min(max((abs(p-vec3(0.,0.,0.)) - vec3(1.,1.,100.)).x, max((abs(p-vec3(0.,0.,0.)) - vec3(1.,1.,100.)).y, (abs(p-vec3(0.,0.,0.)) - vec3(1.,1.,100.)).z)), 0.0) + length(max((abs(p-vec3(0.,0.,0.)) - vec3(1.,1.,100.)), 0.0)));
return d;
}
float Collapted(vec3 p){
float d = Cross(vec3(mod(((p-vec3(2.,2.,2.))*rotM(vec3(0.,1.,0.),p.y*.4)).x,4.)-4.*0.5,mod(((p-vec3(2.,2.,2.))*rotM(vec3(0.,1.,0.),p.y*.4)).y,4.)-4.*0.5,mod(((p-vec3(2.,2.,2.))*rotM(vec3(0.,1.,0.),p.y*.4)).z,4.)-4.*0.5));
return d;
}
float map(vec3 p){
float d = 0.;
d = max(Tunnel(vec3(mod((p).x,40.)-40.*0.5,mod((p).y,400000.)-400000.*0.5,mod((p).z,40.)-40.*0.5)),-Collapted(vec3(mod((p).x,40.)-40.*0.5,mod((p).y,400000.)-400000.*0.5,mod((p).z,40.)-40.*0.5)));
return d;
}
vec3 getnormal(vec3 p){
float d = 0.01;
return normalize(vec3(
map(p + vec3(d, 0.0, 0.0)) - map(p + vec3(-d, 0.0, 0.0)),
map(p + vec3(0.0, d, 0.0)) - map(p + vec3(0.0, -d, 0.0)),
map(p + vec3(0.0, 0.0, d)) - map(p + vec3(0.0, 0.0, -d))
));
}
void main( void) {
vec3 l = normalize(vec3(.0, -.99, .99));
//eye座標
vec3 pos = vec3(20.,0.+time,20.);
vec3 target = vec3(0.,1.,0.);
vec3 dir;
vec3 up = vec3(0.,0.,1.);;
dir = GenRay(normalize(target), up, 120.);
float t = 0.0;
float dist = 0.;
//SphereTracing。ここintersectって名前で別に作る人も多いです
for(float i = 0. ; i < ITE_MAX ; i++) {
//形状表現した陰関数を反復しながら解く
//0(DIST_MIN)に近くなったら解に近いので打ち切り
dist = map((t * dir + pos));
if(dist < DIST_MIN ) {
break;
}
//tを更新。DIST_COEFFは複雑な形状を描画する際に小さく為につけています。
//ちょっとずつレイを進める事ができます。
t += dist * DIST_COEFF;
if(t > DIST_MAX){
break;
}
}
//option形状の近くの位置を出しておく
vec3 ip = pos + dir * t;
//色を作ります。ここでは進めたtの位置(深度)をただ出力するだけ
vec3 color = vec3(0.);
vec3 n = getnormal(ip);
if(dist < DIST_MIN){
float diff = dot(l,n);
color = vec3(0.3,0.8,0.9) * clamp(diff,0.1,1.);
color += vec3(.5) * clamp(dot(n,normalize(dir+l)),0.,1.);
}
color += clamp((1.-20./t),0.,1.)*vec3(.8,.9,.9);
gl_FragColor = vec4(color, 1.0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment