OpenGL 2D标记符号

时间:2014-12-18 04:34:35

标签: opengl graphics 2d

我有以下问题:我正在使用包含一组点的opengl绘制2D场景。每个点都指定它的XY坐标。我想使用标记符号 - 像三角形,十字形或四边形来渲染点。问题是缩放场景时标记大小应在屏幕上保持不变 - 例如使用GL_POINTS。所以每次我改变比例时我都要重新计算我的标记坐标,这是不方便的 - 我想在获得新的渲染点位置时这样做一次。有什么问题吗?

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是你的符号有纹理,然后用点精灵绘制它们。如果你需要这种方法的帮助,我的答案解释了如何使用点精灵:

Render large circular points in modern OpenGL

我想到的另一种方法是在之后应用顶点着色器中的几何缩放,所有其他变换(包括投影)都已应用。

立刻想到的最好的是你将每个顶点的两个属性传递给顶点着色器:

  • 标记的中心,与一个标记的所有顶点的值相同。
  • 与标记中心的相对偏移。

然后在顶点着色器中,应用所有常用的变换,直到并包括投影变换,仅适用于中心。然后添加相对偏移量。

勾勒出顶点着色器,它可能如下所示:

in vec3 centerPos;
in vec2 relativePos;
uniform mat4 ModelViewProj;
...

void main() {
    ...
    vec4 projCenterPos = ModelViewProj * vec4(centerPos, 1.0);
    gl_Position = vec4(
        projCenterPos.xy + projCenterPos.w * relativePos,
        projCenterPos.zw);
}

由于在投影后应用了相对偏移,因此您必须考虑到我们现在具有同质坐标,其中xyz将除以{ {1}}作为顶点着色器后固定函数处理的一部分。要在此透视分割后使大小保持不变,上面的代码会将偏移量乘以w

由于w基本上应用于NDC(标准化设备坐标),其中x方向和y方向的范围是[-1.0,1.0],因此值必须相当小。例如,偏移量0.02对应于窗口大小的1%。

如果您希望调整更灵活,可以传入另一个比例因子来控制精灵的大小,并将relativePos乘以上面计算中的因子。然后你可以保持相对位置,例如在[-1.0,1.0]的范围内,然后适当地缩小它们:

relativePos