0

以下是基本情况:我有一个 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——只是为了测试),但它似乎没有用。不过不知道为什么。这种方法看起来合理吗?

建议?

4

1 回答 1

2
  1. 使用您的 3D 投影设置,3D 坐标投影到屏幕坐标。
  2. 现在设置一个正射投影,它与屏幕像素 1:1 映射,并使用 1. 中确定的窗口坐标来绘制屏幕空间对象。

现在,无论场景的缩放或透视如何,2D 对象都将保持相同的大小和方向。

希望这可以帮助!

于 2012-06-22T04:11:00.020 回答