Math Vulkan 2D几何体着色器生成的几何体线显示parralellogram形状

Math Vulkan 2D几何体着色器生成的几何体线显示parralellogram形状,math,graphics,geometry,vulkan,geometry-shader,Math,Graphics,Geometry,Vulkan,Geometry Shader,我正在尝试为Vulkan项目添加对几何体着色器的支持,所以现在我只是从一些简单的东西开始 目标是,给定一个顶点列表,生成一个围绕该线的完美矩形 为此,我制作了此几何体着色器: #version 450 #extension GL_ARB_separate_shader_objects : enable layout(lines) in; layout(triangle_strip, max_vertices = 6) out; layout(location = 0) in vec2 fra

我正在尝试为Vulkan项目添加对几何体着色器的支持,所以现在我只是从一些简单的东西开始

目标是,给定一个顶点列表,生成一个围绕该线的完美矩形

为此,我制作了此几何体着色器:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(lines) in;
layout(triangle_strip, max_vertices = 6) out;

layout(location = 0) in vec2 fragCoord[];

layout(location = 0) out vec2 fragTexCoord;

void main() {
    vec2 p1 = gl_in[0].gl_Position.xy;
    vec2 p2 = gl_in[1].gl_Position.xy;
    vec2 tangent = normalize(p2 - p1);
    vec2 normal = vec2(tangent.y, -tangent.x) * 0.05;

    vec2 quad[4] = vec2[](p1 + normal, p1 - normal, p2 + normal, p2 - normal);

    // Create first triangle
    gl_Position = vec4(quad[0], 0, 1);
    EmitVertex();
    gl_Position = vec4(quad[1], 0, 1);
    EmitVertex();
    gl_Position = vec4(quad[2], 0, 1);
    EmitVertex();
    EndPrimitive();

    // Create second triangle
    gl_Position = vec4(quad[1], 0, 1);
    EmitVertex();
    gl_Position = vec4(quad[2], 0, 1);
    EmitVertex();
    gl_Position = vec4(quad[3], 0, 1);
    EmitVertex();
    EndPrimitive();
}
哪些产出:

顶点着色器是:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec2 inTexCoord;

layout(location = 0) out vec2 fragTexCoord;

void main() {

    gl_Position = vec4(inPosition, 1.0);
    fragTexCoord = inTexCoord;
}
我不知道为什么直线是平行四边形而不是矩形。根据定义,将线的法线(正交方向)添加到线的两个顶点应形成一个矩形

编辑:

即使在顶点着色器中对顶点进行硬编码,似乎也会产生相同的结果:

vec4 verts[2] = vec4[](vec4(-0.5,-0.5,0,1), vec4(0.5,0.5,0,1));
void main() {
    gl_Position = verts[gl_VertexID];//vec4(inPosition, 1.0);
    fragTexCoord = inTexCoord;
}

我犯了一个愚蠢的错误,因为坐标是在规范化的GL空间上计算的,但窗口不是正方形,所以我的空间被拉伸,破坏了拓扑结构。这是一个完美的正方形图像的结果:

要更正此错误,我必须将纵横比信息传递给着色器,并相应地更正顶点位置