我编写了一个地理着色器,它获取了一条线(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]
答案 0 :(得分:0)
你的公式显然错误。您可以为这些特定输入点创建一个零区域的traingle条。
如果你有一个2D矢量(x,y)
,那么它的两个垂直向量是(-y, x)
和(y, -x)
,而不是(-x,y)和(x,-y)目前使用。
对于您的输入点P0和P1以及您的原始公式,您将得到normalA
和normalB
,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();