-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrm_sphere.frag
46 lines (37 loc) · 1022 Bytes
/
rm_sphere.frag
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
#define RM_ITER_COUNT 32
const float eps = 0.00001;
float scene(in vec3 p)
{
return length(p) - 1.;
}
vec3 calcNormal(in vec3 p)
{
vec3 normal;
vec3 ep = vec3(eps, 0, 0);
normal.x = scene(p + ep.xyz) - scene(p - ep.xyz);
normal.y = scene(p + ep.yxz) - scene(p - ep.yxz);
normal.z = scene(p + ep.yzx) - scene(p - ep.yzx);
return normalize(normal);
}
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
vec2 uv = vec2((fragCoord.x - iResolution.x * .5) / iResolution.y,
(fragCoord.y - iResolution.y * .5) / iResolution.y);
vec4 finalColor = vec4(0,0,0,1);
vec3 rayStart = vec3(0,0,4);
vec3 rayDir = normalize(vec3(uv, -1));
float t = 0.0;
for(int i = 0;i < RM_ITER_COUNT;++i)
{
vec3 p = rayStart + rayDir * t;
float dist = scene(p);
if(dist < eps)
{
vec3 normal = calcNormal(p);
float diffuseFactor = max(dot(normal, vec3(sin(iGlobalTime), cos(iGlobalTime), 1)), 0.0);
finalColor = diffuseFactor * vec4(1,0,0,1);
}
t += dist;
}
fragColor = finalColor;
}