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

时间:2015-11-30 18:02:11

标签: opengl shader render geometry-shader

我编写了一个地理着色器,它获取了一条线(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]

1 个答案:

答案 0 :(得分:0)

你的公式显然错误。您可以为这些特定输入点创建一个零区域的traingle条。

如果你有一个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();