Оптимизация изменения толщины линий в шейдере 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;
}
Отрисовываю треугольниками чтобы сохранить фасеты которые я распарсил, не могу придумать каким образом изменить код. В целях оптимизации не отрисовываю одно ребро, оставляю лишь надежды, что другой фасет будет дорисовывать этот пробел.