Created
January 9, 2018 23:53
-
-
Save Gitmoko/9f6bdc74c0424336312b42e7b752a9a3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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