几何着色器无法按预期工作

Geometry shader doesnt work as expected

我写了一个地理着色器,它得到一条线(2 个顶点)并且应该沿着法线添加宽度(长度)。如果没有地理着色器,一切都会正确显示。我还用铅笔和纸计算了公式(有效)。我用公式计算它们:

N1 = (-(x2 - x1),y2-y1) N2 = (x2 - x1 , -(y2 - y1))

我的代码:

#version 330 core
layout(lines) in;
layout(triangle_strip, max_vertices = 4) out;
uniform float length;

void main()
{
            //A -(x2 - x1) |   y2 - y1
            //B   x2 - x1  | -(y2 - y1)
            vec2 normal = normalize(vec2(gl_in[1].gl_Position.x - gl_in[0].gl_Position.x, gl_in[1].gl_Position.y - gl_in[0].gl_Position.y));
            vec3 normalA = vec3(-normal.x, normal.y, 0);
            vec3 normalB = vec3(normal.x, -normal.y, 0);
            gl_Position = gl_in[0].gl_Position + (vec4(normalB, 0) * length);
            EmitVertex();
            gl_Position = gl_in[0].gl_Position + (vec4(normalA, 0) * length);
            EmitVertex();
            gl_Position = gl_in[1].gl_Position + (vec4(normalA, 0) * length);
            EmitVertex();
            gl_Position = gl_in[1].gl_Position + (vec4(normalB, 0) * length);
            EmitVertex();
            EndPrimitive();
}

P0 [0.3, 0.3] P1 [0.4, 0.3]

您的公式显然错误。您为这些特定的输入点创建了一个面积为零的三角带。

如果你有一个 2D 向量 (x,y),与此垂直的两个向量是 (-y, x)(y, -x),而不是 (-x,y) 和 (x,-y)正如您目前使用的那样。

对于你的输入点 P0 和 P1 以及你的原始公式,你将得到 normalAnormalB 的 y 分量为 0,所以最后,所有 4 个点都将结束在 y=0.3 上排成一条直线,这导致三角形带由两个永远不会被光栅化的零面积三角形组成。

我建议使用以下代码(也稍微简化了语法):

        vec2 direction = normalize(gl_in[1].gl_Position.xy - gl_in[0].gl_Position.xy);
        vec4 offset =v ec4(-direction.y, direction.x, 0, 0) * length;
        gl_Position = gl_in[0].gl_Position - offset;
        EmitVertex();
        gl_Position = gl_in[0].gl_Position + offset;
        EmitVertex();
        gl_Position = gl_in[1].gl_Position + offset;
        EmitVertex();
        gl_Position = gl_in[1].gl_Position - offset;
        EmitVertex();
        EndPrimitive();