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