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

时间:2015-08-04 09:16:07

标签: opengl glsl

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

enter image description here

现在我希望a,b和c在屏幕空间中保持长度。 d应该只是表现正常(在屏幕空间中增长/缩小以及"相机缩放")。

是顶点着色器,调整顶点的位置来获得那种行为,正确的方法去?什么是有效的方法呢?我会使用def pkg_query = "select p from Package as p join p.orgs as orgRole where p.packageScope=(:scope) and orgRole.roleType=(:roleType) and orgRole.org=(:provider)" 调整着色器中的不同顶点吗?

1 个答案:

答案 0 :(得分:1)

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

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

为了说明这个想法,我会选择您的位置在xy中有两个坐标的情况。我们现在仅存储您要在xy中转换的点的坐标,以及wz中的屏幕空间偏移。对于给定的形状,原点位于左下角,则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的一部分,我们将应用转换。涉及bcd的所有维度都在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分量添加到变换后的位置。

您可能需要调整它才能完全满足您的需求。例如,如果您进行项目转换,它会变得有点棘手。但是,将单独的屏幕空间偏移量输入到顶点着色器中的基本思想仍应有效。