From 03a18a05b07879ffc459e8535d6858a7da7dc89b Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Thu, 17 Mar 2022 19:45:50 +0100 Subject: [PATCH] box.geom: GLSL 1.50 --- ogre_media/materials/glsl150/box.geom | 11 +++--- ogre_media/materials/glsl150/glsl150.program | 10 ++++++ .../materials/glsl150/smooth_square.frag | 34 +++++++++++++++++++ .../scripts150/point_cloud_box.material | 4 +-- 4 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 ogre_media/materials/glsl150/smooth_square.frag diff --git a/ogre_media/materials/glsl150/box.geom b/ogre_media/materials/glsl150/box.geom index 6a5337939e..974f889f2f 100644 --- a/ogre_media/materials/glsl150/box.geom +++ b/ogre_media/materials/glsl150/box.geom @@ -23,8 +23,9 @@ in VertexData { vec4 color; } vdata[]; - -out vec4 gl_TexCoord[]; +// Use exactly these names to map onto gl_Color and gl_TexCoord used by fragment shaders +out vec4 color; +out vec2 TexCoord; layout(points) in; layout(triangle_strip, max_vertices=24) out; @@ -43,12 +44,12 @@ void emitVertex( int side, vec4 x, vec4 y, vec4 z, vec3 tex, vec4 size_factor ) vec4 pos_rel = tex.x*x + tex.y*y + tex.z*z; vec4 pos = gl_in[0].gl_Position + vec4( pos_rel * size_factor ); gl_Position = worldviewproj_matrix * pos; - gl_TexCoord[0] = vec4( tex.x*0.5+0.5, tex.y*0.5+0.5, 0.0, 0.0 ); + TexCoord = vec2(tex.x*0.5+0.5, tex.y*0.5+0.5); #ifdef WITH_LIGHTING - gl_FrontColor = vec4( vdata[0].color.rgb * lightness[side], vdata[0].color.a ); + color = vec4( vdata[0].color.rgb * lightness[side], vdata[0].color.a ); #else - gl_FrontColor = vdata[0].color; + color = vdata[0].color; #endif #ifdef WITH_DEPTH diff --git a/ogre_media/materials/glsl150/glsl150.program b/ogre_media/materials/glsl150/glsl150.program index 14c4fba115..b675ef3682 100644 --- a/ogre_media/materials/glsl150/glsl150.program +++ b/ogre_media/materials/glsl150/glsl150.program @@ -78,3 +78,13 @@ vertex_program rviz/glsl150/pass_pos_color.vert glsl { source pass_pos_color.vert } + +fragment_program rviz/glsl150/smooth_square.frag glsl +{ + source smooth_square.frag + default_params + { + param_named_auto highlight custom 5 + param_named_auto alpha custom 1 + } +} diff --git a/ogre_media/materials/glsl150/smooth_square.frag b/ogre_media/materials/glsl150/smooth_square.frag new file mode 100644 index 0000000000..2218e67559 --- /dev/null +++ b/ogre_media/materials/glsl150/smooth_square.frag @@ -0,0 +1,34 @@ +#version 150 + +// rasterizes a smooth square with ax,ay in [-0.5..0.5] + +uniform vec4 highlight; +uniform float alpha; + +in vec4 color; +in vec2 TexCoord; + +out vec4 FragColor; + +void main() +{ + const float outer = 0.48; + const float inner = 0.45; + float ax = TexCoord.x-0.5; + float ay = TexCoord.y-0.5; + + // blending factor, varying between 0.0 (at the border) and 1.0 (at the center of the square) + float blend = smoothstep(-outer, -inner, ay) * (1.0 - smoothstep(inner, outer, ay)) * + smoothstep(-outer, -inner, ax) * (1.0 - smoothstep(inner, outer, ax)); + +#if 1 // high contrast edge (dark edge on light surface / light edge on dark surface) + float inv_blend = 1.0 - blend; + vec3 col = blend * color.rgb + (sign(0.5 - length(vec3(color.rgb))) * vec3(0.2, 0.2, 0.2) + color.rgb) * inv_blend; +#else // alternatively: make color at edge darker + vec3 col = (0.5 + 0.5*blend) * color.rgb; +#endif + + col = col + col * highlight.rgb; + + FragColor = vec4(col.rgb, alpha * color.a); +} diff --git a/ogre_media/materials/scripts150/point_cloud_box.material b/ogre_media/materials/scripts150/point_cloud_box.material index 8c76c163b1..4a136fc600 100644 --- a/ogre_media/materials/scripts150/point_cloud_box.material +++ b/ogre_media/materials/scripts150/point_cloud_box.material @@ -1,6 +1,6 @@ material rviz/PointCloudBox { - /* This material should only be used with glsl < 1.50 */ + /* This material should only be used with glsl >= 1.50 */ // the 'gp' techniques need one input vertex per box // and use geometry shaders to create the geometry @@ -11,7 +11,7 @@ material rviz/PointCloudBox { vertex_program_ref rviz/glsl150/pass_pos_color.vert {} geometry_program_ref rviz/glsl150/box.geom(with_lighting) {} - fragment_program_ref rviz/glsl120/smooth_square.frag {} + fragment_program_ref rviz/glsl150/smooth_square.frag {} } }