aboutsummaryrefslogtreecommitdiff
path: root/resources/shaders/algorithms/raymarching.frag
blob: b8de515f43bc75358d79e993c350a36aa71c9bb8 (plain)
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
// Requirements:
// #define MAX_STEPS 100
// #define MAX_DIST 100.
// GetDist: (vec3 position) => float
// GetDist should return the closest object point distance from position (in the whole scene)

/**
 * Ray Marching algorithm
 * Please take a look at: https://www.youtube.com/watch?v=PGtv-dBi2wE&t=1367s
 * This function return the distance reached by the ray:
 * - If dist<MAX_DIST we hit something
 */
float RayMarch(vec3 ray_origin, vec3 ray_direction) {
	float dist_origin=0.; // Ray start at the origin
    for(int i=0; i<MAX_STEPS; i++) { // If we take to much time to converge (i>=MAX_STEPS)
    	// We move the ray:
    	vec3 ray_position = ray_origin + ray_direction*dist_origin;
    	// We find the next closest point:
        float closest_point = GetDist(ray_position);
        // Increase the ray distance
        dist_origin += closest_point;
        // Check if we went to far or we are too close from a point (we hit a surface)
        if(dist_origin>MAX_DIST || closest_point<SURF_DIST) break;
    }
    return dist_origin;
}