Я пытаюсь написать геометрический шейдер, чтобы заменить glLineWidth
поведение.Я хочу рисовать линии с настраиваемой шириной (пока этого достаточно с равномерной).Линии должны всегда иметь одинаковую толщину, независимо от проекции камеры или расстояния до того места, где находятся линии.
Основываясь на большом количестве прибегая к помощи, я придумал следующий геометрический шейдер:
#version 330
layout (lines) in;
layout (triangle_strip, max_vertices = 4) out;
uniform mat4 u_model_matrix;
uniform mat4 u_view_matrix;
uniform mat4 u_projection_matrix;
uniform float u_thickness = 4; // just a test default
void main()
{
float r = u_thickness / 2;
mat4 mv = u_view_matrix * u_model_matrix;
vec4 p1 = mv * gl_in[0].gl_Position;
vec4 p2 = mv * gl_in[1].gl_Position;
vec2 dir = normalize(p2.xy - p1.xy);
vec2 normal = vec2(dir.y, -dir.x);
vec4 offset1, offset2;
offset1 = vec4(normal * r, 0, 0);
offset2 = vec4(normal * r, 0, 0);
vec4 coords[4];
coords[0] = p1 + offset1;
coords[1] = p1 - offset1;
coords[2] = p2 + offset2;
coords[3] = p2 - offset2;
for (int i = 0; i < 4; ++i) {
coords[i] = u_projection_matrix * coords[i];
gl_Position = coords[i];
EmitVertex();
}
EndPrimitive();
}
Для полноты вот вершинный шейдер:
#version 330
in vec4 a_position;
void main() {
gl_Position = a_position;
}
... и мой фрагментный шейдер:
#version 330
uniform vec4 u_color = vec4(1, 0, 1, 1);
out vec4 fragColor;
void main() {
fragColor = u_color;
}
Я не могу заставить работать математикувсе ситуации.С ортогональной камерой все вышеперечисленное прекрасно работает:
Но с перспективной камерой проблема заключается в том, что линия не имеет фиксированный размер.Он становится все больше и меньше в зависимости от того, как далеко находится объект.
Я ожидал, что линия будет того же размера, используя перспективную камеру.Что я делаю неправильно?