Skip to content

Commit

Permalink
Fix GLSL 1.5 compatibility
Browse files Browse the repository at this point in the history
- Drop compatibility mode, which is not supported by Mesa
- Don't use gl_ prefixes for user-declared variables
- Don't redeclare gl_PerVertex
  • Loading branch information
rhaschke committed Mar 25, 2022
1 parent cf657f4 commit b255497
Show file tree
Hide file tree
Showing 10 changed files with 139 additions and 30 deletions.
17 changes: 9 additions & 8 deletions ogre_media/materials/glsl150/billboard.geom
Expand Up @@ -19,23 +19,24 @@ uniform mat4 worldviewproj_matrix;
uniform vec4 size;
uniform vec4 auto_size;

in gl_PerVertex {
vec4 gl_Position;
vec4 gl_FrontColor;
} gl_in[];
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=4) out;

void emitVertex( vec3 pos_rel, vec3 tex )
{
pos_rel = mat3(inverse_worldview_matrix) * pos_rel;
vec4 pos = gl_in[0].gl_Position + vec4(pos_rel,0.0);
vec4 pos = gl_in[0].gl_Position + vec4(pos_rel, 0.0);
gl_Position = worldviewproj_matrix * pos;
gl_TexCoord[0] = vec4( tex.xy, 0.0, 0.0 );
gl_FrontColor = vec4( gl_in[0].gl_FrontColor );
TexCoord = tex.xy;
color = vdata[0].color;
EmitVertex();
}

Expand Down
18 changes: 9 additions & 9 deletions ogre_media/materials/glsl150/box.geom
Expand Up @@ -19,13 +19,13 @@ uniform mat4 worldviewproj_matrix;
uniform vec4 size;
uniform vec4 auto_size;

in gl_PerVertex {
vec4 gl_Position;
vec4 gl_FrontColor;
} gl_in[];
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;
Expand All @@ -44,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( gl_in[0].gl_FrontColor.rgb * lightness[side], gl_in[0].gl_FrontColor.a );
color = vec4( vdata[0].color.rgb * lightness[side], vdata[0].color.a );
#else
gl_FrontColor = vec4( gl_in[0].gl_FrontColor.rgb, gl_in[0].gl_FrontColor.a );
color = vdata[0].color;
#endif

#ifdef WITH_DEPTH
Expand Down
15 changes: 15 additions & 0 deletions ogre_media/materials/glsl150/flat_color.frag
@@ -0,0 +1,15 @@
#version 150

// Passes the fragment color, multiplying a with the alpha param

uniform vec4 highlight;
uniform float alpha;

in vec4 color;
out vec4 FragColor;

void main()
{
vec3 col = color.xyz + color.xyz * highlight.xyz;
FragColor = vec4(col, color.a * alpha);
}
30 changes: 30 additions & 0 deletions ogre_media/materials/glsl150/glsl150.program
Expand Up @@ -78,3 +78,33 @@ vertex_program rviz/glsl150/pass_pos_color.vert glsl
{
source pass_pos_color.vert
}

fragment_program rviz/glsl150/flat_color.frag glsl
{
source flat_color.frag
default_params
{
param_named_auto highlight custom 5
param_named_auto alpha custom 1
}
}

fragment_program rviz/glsl150/shaded_circle.frag glsl
{
source shaded_circle.frag
default_params
{
param_named_auto highlight custom 5
param_named_auto alpha custom 1
}
}

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
}
}
21 changes: 12 additions & 9 deletions ogre_media/materials/glsl150/pass_pos_color.vert
@@ -1,14 +1,17 @@
#version 150 compatibility
#version 150

// this merely passes over position and color,
// as needed by box.geom
// need to use exactly these names to have OGRE bind the unpacked values:
// https://ogrecave.github.io/ogre/api/latest/_high-level-_programs.html#Binding-vertex-attributes
in vec4 vertex;
in vec4 colour;

out gl_PerVertex {
vec4 gl_Position;
vec4 gl_FrontColor;
};
// this merely passes over position and color as needed by box.geom

out VertexData {
vec4 color;
} vdata;

void main() {
gl_Position = gl_Vertex;
gl_FrontColor = gl_Color;
gl_Position = vertex;
vdata.color = colour;
}
26 changes: 26 additions & 0 deletions ogre_media/materials/glsl150/shaded_circle.frag
@@ -0,0 +1,26 @@
#version 150

// rasterizes a circle that is darker at the borders than in the center

uniform vec4 highlight;
uniform float alpha;

in vec4 color;
in vec2 TexCoord;

out vec4 FragColor;

void main()
{
float ax = TexCoord.x-0.5;
float ay = TexCoord.y-0.5;

float rsquared = ax*ax+ay*ay;
float a = (0.25 - rsquared) * 4.0;

vec3 col = mix(vec3(0.8, 0.8, 0.8) * color.xyz, color.xyz, a);

col = col + col * highlight.xyz;

FragColor = vec4(col, alpha * ceil(a) * color.a);
}
34 changes: 34 additions & 0 deletions 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);
}
4 changes: 2 additions & 2 deletions 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
Expand All @@ -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 {}
}
}

Expand Down
Expand Up @@ -7,7 +7,7 @@ material rviz/PointCloudFlatSquare {
alpha_rejection greater_equal 1
vertex_program_ref rviz/glsl150/pass_pos_color.vert {}
geometry_program_ref rviz/glsl150/billboard.geom {}
fragment_program_ref rviz/glsl120/flat_color.frag {}
fragment_program_ref rviz/glsl150/flat_color.frag {}
}
}

Expand Down
Expand Up @@ -7,7 +7,7 @@ material rviz/PointCloudSphere {
alpha_rejection greater_equal 1
vertex_program_ref rviz/glsl150/pass_pos_color.vert {}
geometry_program_ref rviz/glsl150/billboard.geom {}
fragment_program_ref rviz/glsl120/shaded_circle.frag {}
fragment_program_ref rviz/glsl150/shaded_circle.frag {}
}
}

Expand Down

0 comments on commit b255497

Please sign in to comment.