OpenGL文本引擎

OpenGL文本引擎,opengl,Opengl,有关于如何在OpenGL(FTGL等)中呈现字体的现有资源……我不是在问这个问题。我想知道是否有任何出版的图书馆,算法,论文等处理文本在三维空间相交几何。例如,如果在三维地球上的国家/地区位置绘制标签,则几何图形通常会与地球相交。我见过一些例子,它们总是显示整个标签,但随着标签在地球背面的位置消失,标签会缩小和/或消失 文本引擎可能处理的其他事情是重叠标签的优先级。我曾经在3D映射中工作。这是一个难题。关于它有大量的文献。你将不得不开始谷歌搜索和学习,这是没有办法的 以下是一些方法: 在离地面

有关于如何在OpenGL(FTGL等)中呈现字体的现有资源……我不是在问这个问题。我想知道是否有任何出版的图书馆,算法,论文等处理文本在三维空间相交几何。例如,如果在三维地球上的国家/地区位置绘制标签,则几何图形通常会与地球相交。我见过一些例子,它们总是显示整个标签,但随着标签在地球背面的位置消失,标签会缩小和/或消失


文本引擎可能处理的其他事情是重叠标签的优先级。

我曾经在3D映射中工作。这是一个难题。关于它有大量的文献。你将不得不开始谷歌搜索和学习,这是没有办法的

以下是一些方法:

  • 在离地面一定高度处绘制标签,尽量选择合适的高度
  • 尝试在地面上绘制标签轮廓(需要计算)
  • 将标签栅格化到纹理上,使其成为图像的一部分
  • 使用模具缓冲区技巧将文本(或道路等)切片到几何体中(可能会出现拉伸瑕疵)

虽然我不能推荐合适的库,但我知道一种在3D世界中渲染2D文本标签的非常有效的方法

让我们首先讨论在OpenGL中渲染任何2D文本的最有效方法,然后将这些知识应用于在相机移动时应该移动的文本标签。呈现文本的一种好方法如下所示:

  • 创建包含要使用的字体的所有字符的纹理。以所需大小渲染每个字符,或者如果要将文本缩放到任意大小而不降低质量,请使用带符号的距离字段。将附加信息(如每个字符的纹理坐标以及紧排信息)存储在单独的文件中。一个伟大的工具来创建签名距离场字体纹理可以找到
  • 使用文本字符串作为输入,为文本中的每个字符创建包含单个四边形(或两个三角形)的二维网格。为每个顶点设置正确的纹理坐标。使用字体信息可以正确地进行字距调整和换行。为获得最佳性能,请将网格存储在顶点缓冲区对象中
  • 要渲染文本,只需绑定纹理并渲染网格
具体的实现细节超出了本文的范围,但您可以在本文末尾找到指向示例代码的链接

要在三维世界中渲染二维文本标签,我们必须在每次摄影机移动时更新每个标签的位置。这需要在每一帧重新创建网格,这可能会占用大量CPU,并且可能会将帧速率降至不可接受的水平

一个很好的解决方案是对网格中标签的3D世界位置进行编码,并使用顶点着色器将每个标签每帧移动到相应的2D位置。您只需向网格中的每个顶点添加顶点属性(或为此滥用3D纹理坐标)并存储3D世界位置。实际顶点不应在世界坐标或屏幕坐标中指定,而应相对于(0,0)

绘制网格时,顶点着色器然后从属性或纹理坐标读取3D位置,将其转换为屏幕空间并偏移顶点。尽管这似乎效率低下,但所有数据只需发送到GPU一次,并且所有处理都在GPU上并行完成,而无需CPU参与,这一事实允许您以极高的帧速率渲染数千个2D标签

<> P>一个类似于Visual C++ 2010的系统的实现可以被发现。有关文本标签类,请参见TextRendering示例,有关如何使用它的信息,请参见Stars示例。此代码是用于炉渣C++库:


可以找到Stars样本的视频。

您的问题是什么?如何仅为地图上面向摄影机的点绘制文本?你能澄清你在寻找什么吗?有没有记录在案的技术/库,可以在3d场景中为项目添加标签,而不让标签与几何体相交(如果只是在标称标签位置和深度绘制,通常会这样)。一种简单的方法是绘制几何体,关闭深度测试,然后绘制标签。确定,但是,完全隐藏的标签(例如,地球另一侧的国家标签)将是可见的。但是,如果使用国家质心处多边形的法线(或其他),则可以剔除与相机大致相同方向的标签。