0

I would like to ask how can I render in geometry shader a triangle pipe from a line segment?

I first compute perpendicular vector "perp" to the line vector "axis". Then I rotate the "perp" vector few times by "rotate" function.

Since mesh is composed from 8 vertices I am trying to use "triangle_strip".

enter image description here

My current code :

#version 330 core
layout (lines) in;
layout(triangle_strip, max_vertices = 8) out;//triangle_strip

uniform float u_thickness ;
uniform   vec2    u_viewportSize ;
uniform   bool    u_scale_width_by_zoom ;

in gl_PerVertex
{
  vec4 gl_Position;
  //float gl_PointSize;
  //float gl_ClipDistance[];
} gl_in[];

vec4 rotate(vec4 p, float x, float y, float z,float angle  )
{
    vec3 q;
    q[0] = p[0] * (x*x * (1.0 - cos(angle)) + cos(angle))
        + p[1] * (x*y * (1.0 - cos(angle)) + z * sin(angle))
        + p[2] * (x*z * (1.0 - cos(angle)) - y * sin(angle));

    q[1] = p[0] * (y*x * (1.0 - cos(angle)) - z * sin(angle))
        + p[1]* (y*y * (1.0 - cos(angle)) + cos(angle))
        + p[2] * (y*z * (1.0 - cos(angle)) + x * sin(angle));

    q[2] = p[0] * (z*x * (1.0 - cos(angle)) + y * sin(angle))
        + p[1] * (z*y * (1.0 - cos(angle)) - x * sin(angle))
        + p[2] * (z*z * (1.0 - cos(angle)) + cos(angle));

   return vec4(q, 0.0);

}


void main() {   




      //https://stackoverflow.com/questions/54686818/glsl-geometry-shader-to-replace-gllinewidth

   vec4 p1 = gl_in[0].gl_Position;
    vec4 p2 = gl_in[1].gl_Position;


    //tube
    // Specify the axis to rotate about:
    vec4 axis =  p2-p1;
    float x = axis[0];
    float y = axis[1];
    float z = axis[2];



    axis = normalize(axis);
    //float length = hypotf(axis[0], hypotf(axis[1], axis[2]));
    float length = sqrt((axis[0]*axis[0]) + sqrt(axis[1]*axis[1]+ axis[2]*axis[2]));
    float dir_scalar = (axis[0] > 0.0) ? length : -length;
    float xt = axis[0] + dir_scalar;
    float dot = -axis[1] / (dir_scalar * xt);

    vec3 perp_0 = vec3(dot * xt, 1.0f + dot * axis.y, dot * axis.z);
    perp_0 = normalize(perp_0);
    vec4 perp = vec4(perp_0,0)*u_thickness*0.001;

    //side0
    vec4 p1_1 = p1+perp;
    vec4 p1_2 = p2+perp;

    vec4 perp_rot_2=rotate(perp,x,y,z,60.0 * 3.14 / 180.0);
    vec4 p2_1 = p1+perp_rot_2;
    vec4 p2_2 = p2+perp_rot_2;


    vec4 perp_rot_3=rotate(perp,x,y,z, 120.0 * 3.14 / 180.0);
    vec4 p3_1 = p1+perp_rot_3;
    vec4 p3_2 = p2+perp_rot_3;

    gl_Position = p1_1;
    EmitVertex();
    gl_Position = p1_2;
    EmitVertex();
    gl_Position = p2_1;
    EmitVertex();
    gl_Position = p2_2;
    EmitVertex();
    gl_Position = p3_1;
    EmitVertex();
    gl_Position = p3_2;
    EmitVertex();
    gl_Position = p1_1;
    EmitVertex();
    gl_Position = p1_2;
    EmitVertex();



    EndPrimitive();
}

It produces wrong results: enter image description here

  • 2
    "*Since mesh is composed from 6 vertices I am trying to use "triangle_strip".*" You cannot draw a 3D "triangle pipe" using 6 vertices in a single strip. A single strip of 6 vertices can only draw 4 triangles. A pipe requires 8 triangles. You will have to use multiple strips. – Nicol Bolas Sep 25 '22 at 14:22
  • Even with that I think something is completely wrong in how I obtain the perpendicular vector and how I rotate that. Could you please take a look at the code? – PetrasVestartasEPFL Sep 25 '22 at 14:29
  • @NicolBolas I updated to 8 vertices (code above) where first ones are duplicated. But still rotations are wrong. – PetrasVestartasEPFL Sep 25 '22 at 14:35

0 Answers0