Opengl GLSL顶点着色器以保持屏幕空间大小

Opengl GLSL顶点着色器以保持屏幕空间大小,opengl,glsl,Opengl,Glsl,我有以下由6个顶点组成的几何体: 现在我希望a、b和c在屏幕空间中保持它们的长度。d应该像正常情况一样(在屏幕空间中随着“相机变焦”而增长/收缩) 顶点着色器,调整顶点的位置以获得这种行为,是正确的方法吗?什么是有效的方法?我会使用gl\u VertexID来调整着色器中的不同顶点吗?可以通过在屏幕空间中为每个顶点提供相对偏移作为顶点着色器的单独属性来实现这一点。然后,可以将变换应用于不带偏移的坐标,并将偏移添加到变换后的坐标 事实上,只要组件总数不超过四个,就可以将这些偏移打包到现有的“位置

我有以下由6个顶点组成的几何体:

现在我希望a、b和c在屏幕空间中保持它们的长度。d应该像正常情况一样(在屏幕空间中随着“相机变焦”而增长/收缩)


顶点着色器,调整顶点的位置以获得这种行为,是正确的方法吗?什么是有效的方法?我会使用
gl\u VertexID
来调整着色器中的不同顶点吗?

可以通过在屏幕空间中为每个顶点提供相对偏移作为顶点着色器的单独属性来实现这一点。然后,可以将变换应用于不带偏移的坐标,并将偏移添加到变换后的坐标

事实上,只要组件总数不超过四个,就可以将这些偏移打包到现有的“位置”属性中。例如,如果您的位置只有两个组件,则可以将两个组件的偏移打包到同一属性中

为了说明这个想法,我将选择一个例子,其中您的位置在
x
y
中有两个坐标。现在,我们只在
x
y
中存储要变换的点的坐标,在
w
z
中存储屏幕空间偏移。对于给定形状,原点位于左下角,则6个顶点为:

(0, 0, a - c, 0 )
(0, 0, a    , 0 )
(0, d, a    , 0 )
(0, d, 0    , 0 )
(0, d, 0    , -b)
(0, d, a - c, -b)
请注意x/y和z/w是如何相加到顶点坐标的。但由于您只想变换
d
,因此只有该维度是x/y的一部分,我们将对其应用变换。所有涉及
b
c
d
的维度均以w/z表示,我们将应用未转换的维度

然后,在顶点着色器中,关键片段可以如下所示:

in vec4 Pos;
uniform mat4 Transf;
...
vec4 transfPos = Transf * vec4(Pos.xy, 0.0, 1.0);
transfPos.xy += Pos.wz;
如前所述,我们变换输入顶点的x/y分量,并将w/z分量添加到变换位置


你可能需要调整它来做你需要的事情。例如,如果您有一个项目转换,它会变得有点棘手。但是,将单独的屏幕空间偏移量输入顶点着色器的基本思想应该仍然有效。

为什么要使用着色器,应用变换矩阵就可以了,如果我正确理解您的要求,b如何在屏幕空间中保持相同的长度而d不保持相同的长度,使用变换?是否要拉伸d?是否需要在“帧”上绘制一些东西?如果没有,则通过
glLineWidth()
将线宽设置为b/c,可以仅使用3个顶点绘制这两条固定宽度的线。然后调整一个顶点的位置就足够了。