使用OpenGL和VBOs绘制未缩放的二维符号(精灵)

使用OpenGL和VBOs绘制未缩放的二维符号(精灵),opengl,sprite,scale,Opengl,Sprite,Scale,基本情况是这样的:我有一个OpenGL VBO,它可以绘制2D符号(例如,多边形或线条带,或者其他任何东西——本质上是一个简单的精灵)。我已经定义了原点(0,0)周围的顶点,这样我将获得所需的符号大小(以屏幕像素为单位) 我的当前场景已被平移和缩放,并进行正交投影以显示模型的特定区域。现在,我希望绘制符号,使其位于特定模型位置的中心,但不随模型缩放(即,绘制到VBO中定义的屏幕像素大小)。我更愿意这样做,而不必以编程方式重新填充符号的顶点缓冲区(即,我希望使用平移和/或缩放以屏幕像素为单位绘制符

基本情况是这样的:我有一个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?
    ...
}
我尝试过这个方法(实际上,我尝试过在所需的屏幕位置直接渲染一个简单的线条,而不是使用翻译过的VBO——只是为了测试),但它似乎不起作用。但我不知道为什么。这种方法听起来合理吗

建议

  • 使用3D投影集,3D坐标将转换为屏幕坐标
  • 现在,使用屏幕像素1:1映射正交投影,并使用1中确定的窗口坐标。绘制屏幕空间对象
  • 现在,无论场景的缩放或透视效果如何,2D对象都将保持相同的大小和方向


    希望这有帮助

    嗯。。。我怎么能做到“不要紧”呢?我意识到在绘制符号/精灵之前,我需要重新建立正交投影。这似乎正在起作用。不过,我不确定是否有更好的方法。我是不是应该把这个问题留给别人?我自己回答(呃,还是感觉不对)?就是这样。我在发帖后不久就自己解决了这个问题(见我的评论)。你一针见血,我很高兴接受你的回答。@Zyneak,我已经用工作链接更新了答案。非常感谢!