blob: 0f61544f2a3a6e9b32e1d703f608bfda4cc7e842 (
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
|
// Requirements:
// #define NORMAL_ACCURACY 0.01
// GetDist: (vec3 position) => float
// GetDist should return the closest object point distance from position (in the whole scene)
/**
* Compute the normal of an object at a given surface point
* this can be usefull for lighting etc..
* This function exploit the fact that the gradient on a given surface point in 3D space
* given the normal direction (source: https://fr.wikipedia.org/wiki/Gradient#Dimension_3_:_gradient_normal_%C3%A0_une_surface_en_un_point,_plan_tangent)
*
*
*/
vec3 GetNormal(vec3 point_position) {
float point_distance = GetDist(point_position);
vec2 epsilon = vec2(NORMAL_ACCURACY, 0); // Just a convenient way to use NORMAL_ACCURACY and 0
// Compute the gradient
vec3 gradient = point_distance - vec3(
GetDist(point_position-epsilon.xyy),
GetDist(point_position-epsilon.yxy),
GetDist(point_position-epsilon.yyx));
return normalize(gradient);
}
|