in src/elm_src/Algorithm/fractals.c [574:652]
vec4 render(vec2 pixel)
{
vec3 ray_direction = rayDirection(pixel);
float ray_length = minRange;
vec3 ray = cameraPosition + ray_length * ray_direction;
vec4 bg_color = vec4(clamp(mix(background2Color, background1Color, (sin(ray_direction.y * HALFPI) + 1.0) * 0.5), 0.0, 1.0), 1.0);
vec4 color = bg_color;
float eps = MIN_EPSILON;
vec3 dist;
vec3 normal = vec3(0);
int steps = 0;
bool hit = false;
float tmin = 0.0;
float tmax = 10000.0;
if (intersectBoundingSphere(ray, ray_direction, tmin, tmax)) {
ray_length = tmin;
ray = cameraPosition + ray_length * ray_direction;
for (int i = 0; i < stepLimit; i++) {
steps = i;
dist = dE(ray);
dist.x *= surfaceSmoothness;
// If we hit the surface on the previous step check again to make sure it wasn't
// just a thin filament
if (hit && dist.x < eps || ray_length > tmax || ray_length < tmin) {
steps--;
break;
}
hit = false;
ray_length += dist.x;
ray = cameraPosition + ray_length * ray_direction;
eps = ray_length * epsfactor;
if (dist.x < eps || ray_length < tmin) {
hit = true;
}
}
}
// Found intersection?
float glowAmount = float(steps)/float(stepLimit);
float glow;
if (hit) {
float aof = 1.0, shadows = 1.0;
glow = clamp(glowAmount * innerGlowIntensity * 3.0, 0.0, 1.0);
if (steps < 1 || ray_length < tmin) {
normal = normalize(ray);
} else {
normal = generateNormal(ray, eps);
aof = ambientOcclusion(ray, normal, eps);
}
color.rgb = mix(color1, mix(color2, color3, dist.y * color2Intensity), dist.z * color3Intensity);
color.rgb = blinnPhong(clamp(color.rgb * color1Intensity, 0.0, 1.0), ray, normal);
color.rgb *= aof;
color.rgb = mix(color.rgb, innerGlowColor, glow);
color.rgb = mix(bg_color.rgb, color.rgb, exp(-pow(ray_length * exp(fogFalloff), 2.0) * fog));
color.a = 1.0;
} else {
// Apply outer glow and fog
ray_length = tmax;
color.rgb = mix(bg_color.rgb, color.rgb, exp(-pow(ray_length * exp(fogFalloff), 2.0)) * fog);
glow = clamp(glowAmount * outerGlowIntensity * 3.0, 0.0, 1.0);
color.rgb = mix(color.rgb, outerGlowColor, glow);
if (transparent) color = vec4(0.0);
}
// if (depthMap) {
// color.rgb = vec3(ray_length / 10.0);
// }
return color;
}