Оптимизация изменения толщины линий в шейдере OpenGL 4.1

Цель изменить работу шейдера, с возможностью отрисовывать модели с большим колличеством рёбер, чтобы те не приводили к зависанию при расчётах.

Имею следующий код для отрисовки рёбер:

void Mesh::DrawEdge(const ModelSettings &settings, QOpenGLShaderProgram &shader) {
  if (settings.GetEdgeSettings().type != EdgeType::kNo) {
  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

//  if (settings.GetEdgeSettings().type == EdgeType::kLine) {
//    glDisable(GL_LINE_STIPPLE);
//  } else if (settings.GetEdgeSettings().type == EdgeType::kDotted) {
//    glLineStipple(1, 0x3333);
//    glEnable(GL_LINE_STIPPLE);
//  }

  VAO.bind();

  shader.setUniformValue("u_thickness", settings.GetEdgeSettings().size);
  shader.setUniformValue("PointColor", settings.GetEdgeSettings().color);
  glDrawElementsInstancedBaseVertex(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, nullptr, 1, 0);
  }
}

shader.vert

#version 410 core
layout (location = 0) in vec3 aPos;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main(void) {
  gl_Position = projection * view * model * vec4(aPos, 1.0);
}

shader.geom

#version 410 core

layout (triangles) in;
layout (triangle_strip, max_vertices = 8) out;

uniform vec2    u_viewportInvSize;
uniform float   u_thickness;

void main() {
    vec4 p1 = gl_in[0].gl_Position;
    vec4 p2 = gl_in[1].gl_Position;
    vec4 p3 = gl_in[2].gl_Position;

    vec2 dir    = normalize((p2.xy/p2.w - p1.xy/p1.w) * u_viewportInvSize);
    vec2 offset = vec2(-dir.y, dir.x) * u_thickness / u_viewportInvSize;

    gl_Position = p1 + vec4(offset.xy * p1.w, 0.0, 0.0);
    EmitVertex();
    gl_Position = p1 - vec4(offset.xy * p1.w, 0.0, 0.0);
    EmitVertex();
    gl_Position = p2 + vec4(offset.xy * p2.w, 0.0, 0.0);
    EmitVertex();
    gl_Position = p2 - vec4(offset.xy * p2.w, 0.0, 0.0);
    EmitVertex();

    dir    = normalize((p3.xy/p3.w - p2.xy/p2.w) * u_viewportInvSize);
    offset = vec2(-dir.y, dir.x) * u_thickness / u_viewportInvSize;

    gl_Position = p2 + vec4(offset.xy * p2.w, 0.0, 0.0);
    EmitVertex();
    gl_Position = p2 - vec4(offset.xy * p2.w, 0.0, 0.0);
    EmitVertex();
    gl_Position = p3 + vec4(offset.xy * p3.w, 0.0, 0.0);
    EmitVertex();
    gl_Position = p3 - vec4(offset.xy * p3.w, 0.0, 0.0);
    EmitVertex();

    EndPrimitive();
}

shader.frag

#version 410 core

out vec4 FragColor;

uniform vec4 PointColor;

void main(void) {
      FragColor = PointColor;
}

Отрисовываю треугольниками чтобы сохранить фасеты которые я распарсил, не могу придумать каким образом изменить код. В целях оптимизации не отрисовываю одно ребро, оставляю лишь надежды, что другой фасет будет дорисовывать этот пробел.


Ответы (0 шт):