opengl地图应用程序中的标签

opengl地图应用程序中的标签,opengl,rendering,texturing,labeling,Opengl,Rendering,Texturing,Labeling,短版 如何在OpenGL映射应用程序中绘制短文本标签,而不必在用户放大和缩小时手动重新计算坐标 长版本 我有一个基于OpenGL的映射应用程序,我需要能够绘制高达250k点的数据集。每个点可以有一个短文本标签,通常约4或5个字符长 目前,我使用一个包含所有字符的textue来实现这一点。对于每个点,我为其标签中的每个字符定义一个四边形。因此,标签为“Fred”的点将有四个四边形与之关联,每个四边形使用纹理坐标到单个纹理中,以绘制其相应的角色 绘制地图时,我以地图坐标(例如,经度/纬度)绘制地图点

短版

如何在OpenGL映射应用程序中绘制短文本标签,而不必在用户放大和缩小时手动重新计算坐标

长版本

我有一个基于OpenGL的映射应用程序,我需要能够绘制高达250k点的数据集。每个点可以有一个短文本标签,通常约4或5个字符长

目前,我使用一个包含所有字符的textue来实现这一点。对于每个点,我为其标签中的每个字符定义一个四边形。因此,标签为“Fred”的点将有四个四边形与之关联,每个四边形使用纹理坐标到单个纹理中,以绘制其相应的角色

绘制地图时,我以地图坐标(例如,经度/纬度)绘制地图点本身。然后我计算每个点在屏幕坐标中的位置,并再次在屏幕坐标中更新每个点的标签四边形的四个角点。(例如,如果我确定该点是在屏幕点100、150处绘制的,我可以将该点标签中第一个字符的四元组设置为矩形,从左上角105、155开始,宽度为6像素,高度为12像素,这对于特定的字符是合适的。然后第二个字符可能从120开始,155等)然后,一旦所有这些标签字符四边形都正确定位,我就使用正交屏幕投影绘制它们

问题是更新所有这些字符四坐标的过程很慢,对于具有150k个点的特定测试数据集,需要大约半秒的时间(这意味着,由于每个标签大约有四个字符长,因此大约有150k*[4个字符/点]*[4个坐标对/字符]每次更新时需要设置的坐标对

如果地图应用程序不涉及缩放,我就不需要在每次刷新时重新计算所有这些坐标。我可以只计算一次标签坐标,然后简单地移动我的查看矩形以显示正确的区域。但是随着缩放,我看不到如何在不进行协调计算的情况下使其工作,因为否则字符角色在放大时会变大,在缩小时会变小

我想要的(我理解OpenGL没有提供的)是告诉OpenGL应该在一个固定的屏幕坐标矩形中绘制一个四边形,但该矩形的左上角位置应该是距离地图坐标空间中给定点的固定距离。所以我想要两个基本层次(给定的贴图点是其标签字符四边形的父对象)以及在此层次中混合两个不同坐标系的能力

我试图了解是否有一些神奇的变换矩阵可以从我身上实现所有这些,但我不知道如何实现

我考虑过的另一种选择是在每个点上使用着色器来处理计算该点的标签字符四坐标。我以前没有使用过着色器,我只是想了解(a)是否可以使用着色器来完成此操作,以及(b)在着色器代码中计算所有这些点是否真的比自己计算它们更能给我带来好处。(顺便说一句,我已经确认最大的瓶颈是计算四坐标,而不是将更新后的坐标上传到GPU。GPU需要一点时间,但正是计算,更新的坐标数量占据了这半秒钟的大部分时间。)

(当然,另一种选择是首先更明智地确定在给定视图中需要绘制哪些标签。但现在我想集中讨论假设所有标签都需要绘制的解决方案。)

因此基本问题(“否则,字符会随着放大而变大,随着缩小而变小”)是在地图坐标而不是屏幕坐标中进行计算吗?如果在屏幕坐标中进行计算,这将需要更多的计算?显然,任何渲染都需要从地图坐标转换到屏幕坐标。问题似乎是从地图转换到屏幕太晚了。因此为每个点做一个单独的映射到屏幕,然后在屏幕坐标中工作,您主要在映射坐标中工作,然后在最后将每个字符转换为屏幕坐标。缓慢的部分是,您在屏幕坐标中工作,然后必须手动转换回映射坐标,以便告诉OpenGL映射坐标,并且它将将这些转换回屏幕坐标!这是对您问题的公平评估吗

因此,解决方案是在管道中更早地推进该转换。然而,我可以理解为什么这很棘手,因为乍一看,OpenGL似乎想在“世界坐标”(对您而言,是地图坐标)中完成所有操作,而不是在屏幕坐标中

首先,我想知道你为什么要对每个字符进行单独的坐标计算。你使用的是什么字体渲染系统?像FreeType这样的东西会自动生成整个字符串的位图图像,并且不需要你对每个字符进行操作[编辑[/strong>:这不太正确;请参阅注释]。您肯定不需要计算每个字符的地图坐标(甚至屏幕坐标)。计算标签左上角的屏幕坐标,让字体渲染系统一次生成整个标签的位图。这将使速度提高大约四倍(因为假设每个标签有4个字符)

现在,对于在屏幕坐标系中工作来说,了解一些着色器可能会有所帮助。对OpenGL了解得越多,就越会发现它实际上根本不是一个3D渲染引擎。它只是一个内置了一些非常快速的矩阵基元的2D图形库。OpenGL实际上在lowes工作