In the code below only CreateCircle will work. I’m using the geometry shader to create a primitive at points so the functions only emit vertices, nothing extreme. Also, I know each of the functions does as expected as I can run each of them individually by declaring them as first function. My only guess might be that Im not ‘closing’ the function correctly?
Im running an AMD FirePro V7900 with driver version 8.911.3.1000 dated 16/01/2012
#version 330
#extension GL_EXT_geometry_shader4 : enable
precision highp float;
void createCircleGeometry(in vec4 v, in float f_size, in mat4 orientation)
{
int NVC = 9;
float fNVC = 9.;
float a = 0.;
float s = 3.1415 * 2. / fNVC;
for(int i=0; i<NVC; i++, a+=s)
{
//gl_Position = v + (gl_ModelViewProjectionMatrix * (orientation*vec4(cos(a)*f_size, sin(a)*f_size, 0., 0.)));
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(cos(a)*f_size, sin(a)*f_size, 0., 0.));
EmitVertex();
gl_Position = v;
EmitVertex();
}
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(cos(0)*f_size, sin(0)*f_size, 0., 0.));
EmitVertex();
EndPrimitive();
}
void createTriangleGeometry(in vec4 v, in float f_size, in mat4 orientation)
{
gl_Position = v; EmitVertex(); //n1
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(0., f_size, 0., 0.)); EmitVertex(); //n2
gl_Position = v; EmitVertex(); //n3
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(f_size/4, f_size/2, 0., 0.)); EmitVertex(); //n4
gl_Position = v; EmitVertex(); //n5
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(f_size/2, 0., 0., 0.)); EmitVertex(); //n6
gl_Position = v; EmitVertex(); //n7
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(f_size, -f_size, 0., 0.)); EmitVertex(); //n8
gl_Position = v; EmitVertex(); //n9
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(0., -f_size, 0., 0.)); EmitVertex(); //n10
gl_Position = v; EmitVertex(); //n11
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(-f_size, -f_size, 0., 0.)); EmitVertex(); //n12
gl_Position = v; EmitVertex(); //n13
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(-f_size/2, 0., 0., 0.)); EmitVertex(); //n14
gl_Position = v; EmitVertex(); //n15
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(-f_size/4, f_size/2, 0., 0.)); EmitVertex(); //n16
gl_Position = v; EmitVertex(); //n17
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(0., f_size, 0., 0.)); EmitVertex(); //n18
gl_Position = v; EmitVertex(); //n19
EndPrimitive();
}
void createRectangleGeometry(in vec4 v, in float f_size, in mat4 orientation)
{
gl_Position = v; EmitVertex(); //n1
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(0., f_size, 0., 0.)); EmitVertex(); //n2
gl_Position = v; EmitVertex(); //n3
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(f_size, f_size, 0., 0.)); EmitVertex(); //n4
gl_Position = v; EmitVertex(); //n5
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(f_size, 0., 0., 0.)); EmitVertex(); //n6
gl_Position = v; EmitVertex(); //n7
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(f_size, -f_size, 0., 0.)); EmitVertex(); //n8
gl_Position = v; EmitVertex(); //n9
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(0., -f_size, 0., 0.)); EmitVertex(); //n10
gl_Position = v; EmitVertex(); //n11
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(-f_size, -f_size, 0., 0.)); EmitVertex(); //n12
gl_Position = v; EmitVertex(); //n13
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(-f_size, 0., 0., 0.)); EmitVertex(); //n14
gl_Position = v; EmitVertex(); //n15
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(-f_size, f_size, 0., 0.)); EmitVertex(); //n16
gl_Position = v; EmitVertex(); //n17
gl_Position = v + (gl_ModelViewProjectionMatrix * vec4(0., f_size, 0., 0.)); EmitVertex(); //n18
gl_Position = v; EmitVertex(); //n19
EndPrimitive();
}
in vec4 v_colorVS;
in float f_size;
in float f_style;
in float f_dip;
in float f_azimuth;
out vec4 v_color_out;
void main(void)
{
v_color_out = v_colorVS[0];
vec4 v = gl_PositionIn[0];
// Create the orientation matrix
mat4 dip_rot = mat4( 1., 0., 0., 0.,
0., cos(f_dip[0]), -sin(f_dip[0]), 0.,
0., sin(f_dip[0]), cos(f_dip[0]), 0.,
0., 0., 0., 1.);
mat4 azimuth_rot = mat4( cos(f_azimuth[0]), -sin(f_azimuth[0]), 0., 0.,
sin(f_azimuth[0]), cos(f_azimuth[0]), 0., 0.,
0., 0., 1., 0.,
0., 0., 0., 1.);
mat4 orientation = matrixCompMult(dip_rot,azimuth_rot);
// Create the marker geometry
createCircleGeometry(v,f_size[0],orientation);
//createRectangleGeometry(v,f_size[0],orientation);
//createTriangleGeometry(v,f_size[0],orientation);
}