# 【GLSL】球と一つの光源

See the Pen sphere with a moving light by aadebdeb (@aadebdeb) on CodePen.

```#define PI 3.14159265359
#define TWO_PI PI * 2.0

precision mediump float;

uniform float u_time;
uniform vec2 u_mouse;
uniform vec2 u_resolution;

float calcSphereDistance(vec3 p, float size) {
return length(p) - size;
}

float calcDistance(vec3 p) {
float d = calcSphereDistance(p, 1.0);
return d;
}

vec3 calcNormal(vec3 p) {
float delta = 0.00001;
return normalize(vec3(
calcDistance(p + vec3(delta, 0.0, 0.0)) - calcDistance(p - vec3(delta, 0.0, 0.0)),
calcDistance(p + vec3(0.0, delta, 0.0)) - calcDistance(p - vec3(0.0, delta, 0.0)),
calcDistance(p + vec3(0.0, 0.0, delta)) - calcDistance(p - vec3(0.0, 0.0, delta))
));
}

void main(void) {
vec2 st = (gl_FragCoord.xy * 2.0 - u_resolution) / min(u_resolution.x, u_resolution.y);

vec3 cameraPosition = vec3(0.0, 0.0, 10.0);
vec3 rayDirection = normalize(vec3(st, 0.0) - cameraPosition);
vec3 rayPosition = cameraPosition;
float radian = u_time * 0.001;
vec3 lightPosition = vec3(10.0 * sin(radian), 10.0, 10.0 * cos(radian));
vec3 color = vec3(0.0);
for (int i = 0; i < 16; i++) {
float d = calcDistance(rayPosition);
if (d < 0.0001) {
vec3 normal = calcNormal(rayPosition);
float weight = dot(normal, normalize(lightPosition));
color = vec3(0.8) * max(weight, 0.0) + vec3(0.1);
break;
}
rayPosition += rayDirection * d;
}
gl_FragColor = vec4(color, 1.0);
}```