1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
precision mediump float;
uniform vec2 resolution;
uniform float time;
vec3 trans(vec3 p)
{
return mod(p, 8.0)-4.0;
}
float distanceFunction(vec3 pos)
{
return length(trans(pos)) - 1.5;
}
vec3 getNormal(vec3 p)
{
const float d = 0.0001;
return
normalize
(
vec3
(
distanceFunction(p+vec3(d, 0.0, 0))-distanceFunction(p+vec3(-d,0.0,0.0)),
distanceFunction(p+vec3(0.0, d, 0.0))-distanceFunction(p+vec3(0.0,-d,0.0)),
distanceFunction(p+vec3(0.0, 0.0, d))-distanceFunction(p+vec3(0.0,0.0,-d))
)
);
}
void main() {
vec2 pos = (gl_FragCoord.xy*2.0 -resolution) / resolution.y;
vec3 camPos = vec3(0.0, 0.0, 3.0);
vec3 camDir = vec3(0.0, 0.0, -1.0);
vec3 camUp = vec3(0.0, 1.0, 0.0);
vec3 camSide = cross(camDir, camUp);
float focus = sin(time)*1.5+4.0;
mat3 lense = mat3(1.,0.,0.,
0.,888989898989898989,0.,
0.,0.,1.);
vec3 pos3 = vec3(pos,camDir.z*10.);
camDir = vec3(
camDir.x,
camDir.y,
camDir.z);
camDir*=normalize(dot(camDir,pos3));
vec3 rayDir = normalize(camSide*pos.x + camUp*pos.y + camDir*focus);
float t = 0.0, d;
vec3 posOnRay = camPos;
for(int i=0; i<64; ++i)
{
d = distanceFunction(posOnRay);
t += d;
posOnRay = camPos + t*rayDir;
}
vec3 normal = getNormal(posOnRay);
if(abs(d) < 0.001)
{
gl_FragColor = vec4(normal, 1.0);
}else
{
gl_FragColor = vec4(0.0);
}
}
|