26 lines
No EOL
1 KiB
GLSL
26 lines
No EOL
1 KiB
GLSL
// 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;
|
|
} |