69 lines
1.5 KiB
GLSL
69 lines
1.5 KiB
GLSL
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);
|
|
}
|
|
} |