diff options
author | enricoturri1966 <enricoturri@seznam.cz> | 2020-03-13 17:09:07 +0300 |
---|---|---|
committer | enricoturri1966 <enricoturri@seznam.cz> | 2020-03-13 17:09:07 +0300 |
commit | b36051af82f372a9555eb03025d85f7cbd6a07cd (patch) | |
tree | 40fa7401ca8e810de9dc0e7430dac36550e22803 /resources | |
parent | 84c9136e2d990b2079890b66fd88568f29dbf859 (diff) |
New tech ENABLE_SLOPE_RENDERING - 1st installment of rendering objects colored by facets slope
Diffstat (limited to 'resources')
-rw-r--r-- | resources/shaders/gouraud.fs | 24 | ||||
-rw-r--r-- | resources/shaders/gouraud.vs | 18 |
2 files changed, 38 insertions, 4 deletions
diff --git a/resources/shaders/gouraud.fs b/resources/shaders/gouraud.fs index 09003f407..be75b7d9a 100644 --- a/resources/shaders/gouraud.fs +++ b/resources/shaders/gouraud.fs @@ -1,6 +1,21 @@ #version 110 const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const vec3 GREEN = vec3(0.0, 0.65, 0.0); +const vec3 YELLOW = vec3(0.5, 0.65, 0.0); +const vec3 RED = vec3(0.65, 0.0, 0.0); +const float EPSILON = 0.0001; + +struct SlopeDetection +{ + bool active; + // x = yellow z, y = red z + vec2 z_range; + mat3 volume_world_normal_matrix; +}; + +uniform vec4 uniform_color; +uniform SlopeDetection slope; varying vec3 clipping_planes_dots; @@ -10,14 +25,19 @@ varying vec2 intensity; varying vec3 delta_box_min; varying vec3 delta_box_max; -uniform vec4 uniform_color; +varying float world_normal_z; +vec3 slope_color() +{ + return (world_normal_z > slope.z_range.x - EPSILON) ? GREEN : mix(RED, YELLOW, (world_normal_z - slope.z_range.y) / (slope.z_range.x - slope.z_range.y)); +} void main() { if (any(lessThan(clipping_planes_dots, ZERO))) discard; + vec3 color = slope.active ? slope_color() : uniform_color.rgb; // if the fragment is outside the print volume -> use darker color - vec3 color = (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) ? mix(uniform_color.rgb, ZERO, 0.3333) : uniform_color.rgb; + color = (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; gl_FragColor = vec4(vec3(intensity.y, intensity.y, intensity.y) + color * intensity.x, uniform_color.a); } diff --git a/resources/shaders/gouraud.vs b/resources/shaders/gouraud.vs index cc54c1c44..3c06729f8 100644 --- a/resources/shaders/gouraud.vs +++ b/resources/shaders/gouraud.vs @@ -20,13 +20,22 @@ const vec3 ZERO = vec3(0.0, 0.0, 0.0); struct PrintBoxDetection { + bool active; vec3 min; vec3 max; - bool volume_detection; mat4 volume_world_matrix; }; +struct SlopeDetection +{ + bool active; + // x = yellow z, y = red z + vec2 z_range; + mat3 volume_world_normal_matrix; +}; + uniform PrintBoxDetection print_box; +uniform SlopeDetection slope; // Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. uniform vec2 z_range; @@ -41,6 +50,8 @@ varying vec3 delta_box_max; varying vec3 clipping_planes_dots; +varying float world_normal_z; + void main() { // First transform the normal into camera space and normalize the result. @@ -61,7 +72,7 @@ void main() intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; // compute deltas for out of print volume detection (world coordinates) - if (print_box.volume_detection) + if (print_box.active) { vec3 v = (print_box.volume_world_matrix * gl_Vertex).xyz; delta_box_min = v - print_box.min; @@ -73,6 +84,9 @@ void main() delta_box_max = ZERO; } + // z component of normal vector in world coordinate used for slope shading + world_normal_z = slope.active ? (normalize(slope.volume_world_normal_matrix * gl_Normal)).z : 0.0; + gl_Position = ftransform(); // Point in homogenous coordinates. vec4 world_pos = print_box.volume_world_matrix * gl_Vertex; |