几何着色器无法按预期工作
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 以及你的原始公式,你将得到 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();
我写了一个地理着色器,它得到一条线(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 以及你的原始公式,你将得到 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();