Vulkan 2D 几何着色器生成的几何线呈现平行四边形形状
Vulkan 2D geometry shader generated geometry lines exhibiting parralellogram shape
我正在尝试为 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;
}
我犯了一个愚蠢的错误,因为坐标是在 NORMALIZED GL space 上计算的,但是 window 不是正方形,我的 space 被拉伸了,破坏了拓扑。这是完美方形图像的结果:
要更正此错误,我必须将纵横比信息传递给着色器并相应地更正顶点位置。
我正在尝试为 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;
}
我犯了一个愚蠢的错误,因为坐标是在 NORMALIZED GL space 上计算的,但是 window 不是正方形,我的 space 被拉伸了,破坏了拓扑。这是完美方形图像的结果:
要更正此错误,我必须将纵横比信息传递给着色器并相应地更正顶点位置。