使用OpenGL和VBO绘制未缩放的2D符号(精灵)

时间:2012-06-22 03:46:44

标签: opengl sprite scale

这是基本情况:我有一个OpenGL VBO绘制2D符号(例如,多边形或线条,或其他 - 基本上是一个简单的精灵)。我已经定义了原点(0,0)周围的顶点,这样我就能得到屏幕像素中所需的符号大小。

我当前的场景已经过翻译和缩放以及正投影以显示模型的特定区域。我现在想要绘制符号,使其以特定模型位置为中心但不用模型缩放(即,绘制到VBO中定义的屏幕像素大小)。我更喜欢这样做,而无需以编程方式重新填充符号的顶点缓冲区(即,我想使用平移和/或缩放在屏幕像素中绘制符号,但在所需的位置 - 这是在“模型”坐标中定义。

一个简单示例:显示使用经度和纬度的地图,用户已平移并缩放到世界的特定区域。用户点击感兴趣的网站,我想在那时显示“明星”。星星将与地图一起平移,但保持与用户放大或缩小相同的大小。所以在任何时候我都知道(经度,纬度坐标)在哪里“居中”这颗恒星,我有一个VBO定义(以像素坐标为单位)所需大小的星形(以原点为中心)。

那么,在这种情况下渲染“未缩放”符号/精灵的“最佳”方式是什么?

我想我已经知道该去哪了,但是(1)我不确定这种方法是否正确而且(2)它似乎不像我期望的那样工作。这是我的一般想法的一些伪代码:

void DrawSymbol()
{
    ...
    [Not Shown: Determine the screen coordinates of the symbol's desired model location]

    gl.MatrixMode(GL_PROJECTION);
    gl.PushMatrix();    // Store the current projection
    gl.LoadIdentity();  // Set projection to identity (no projection)

    gl.MatrixMode(GL_MODELVIEW);
    gl.PushMastrix();   // Store the current model view (was scaled and translated)
    gl.LoadIdentity();  // Set model view matrix to identity (1-to-1 with screen coords)

    [Not Shown: Translate the model view so that the origin is at the desired screen coordinate found above]

    [Not Shown: Draw the VBO for the symbol] // should draw to raw screen pixels, right?

    gl.MatrixMode(GL_MODELVIEW);
    gl.PopMatrix();     // Set model view matrix to previous value -- should only effect any future renders, right?

    gl.MatrixMode(GL_PROJECTION);
    gl.PopMatrix();     // Set projection matrix to previous value -- again, should only effect any future renders, right?
    ...
}

我已经尝试了这个(实际上,我通过在所需的屏幕位置直接渲染一个简单的LineStrip而不是使用翻译的VBO - 仅用于测试)来尝试它并且它似乎不起作用。但不知道为什么。这种方法看起来是否合理?

建议?

1 个答案:

答案 0 :(得分:2)

  1. 使用3D投影设置,project 3D坐标到屏幕坐标。
  2. 现在set up一个正投影,用屏幕像素1:1映射,并使用1.中确定的窗口坐标来绘制屏幕空间对象。
  3. 现在,无论场景的缩放或透视,2D对象都将保持相同的大小和方向。

    希望这有帮助!