我正在与OpenGL和Qt合作。我在OpenGLWidget中渲染一个场景。当在场景中的对象上盘旋时,我想在选定对象附近显示一个带有文本的框。我已经实现了对象的选择。
我想出了两种可能的方法。
QLabel)放置在呈现场景的OpenGLWidget之上。您推荐的两种方法中的哪一种,请给我一些关于实现的建议。或者,您可以推荐另一种方法。谢谢!
发布于 2019-01-09 02:39:56
嗨@Artic,我不是Qt专家,所以我不能给您提供有关小部件的信息,但是我可以给您一些关于用OpenGL创建标签的提示。在这里给出一个完整的实现是很棘手的,因为这在很大程度上取决于您想要如何显示文本。但我会试着概述你的一些选择。
要在OpenGL中渲染文本,大多数人都会使用一种称为位图字体的技术,在这里可以看到更多信息:https://learnopengl.com/In-Practice/Text-Rendering位图字体的概念相当直截了当,所有字符都被预先扫描成一个纹理,然后你可以根据你需要的字符从纹理的每一部分中取样。你建立你的标签由四边形,纹理与每一个字符的每一部分的位图样本。
有符号距离字段基本上使用相同的技术,但是字符的前栅格化纹理是使用有符号距离字段呈现的,这处理了标准位图字体所具有的一些问题。
在基本术语中,SDF的工作方式是生成字体的特殊纹理或图像,该字体存储从每个字符的边缘到中心的距离,使用图像的颜色通道记录数据。
如果您使用有符号距离字段,仅仅从位图中进行示例是不够的,以这种方式呈现的字体需要额外的工作(通常使用着色器程序完成)才能生成正确的呈现。
一旦您有了生成标签的方法,您就可以决定是在屏幕空间还是在世界空间中显示它。
如果您想在世界空间(在模型或项目上方悬停在标签上)显示它,则需要做更多的工作,如果您希望该标签始终面向摄像机,并且这种技术称为“广告牌”。
如果您只想在屏幕空间中呈现一些文本,也可以将文本呈现为“动态”。您可以使用像SDL_ttf这样的库。请参阅:fonts/index.php
在本例中,您使用SDL_ttf将文本字符串呈现到具有您选择的维度的表面,然后可以从该表面创建OpenGL纹理并将其呈现到屏幕上。
对不起,如果这个信息有点广泛,我需要一个更具体的问题来给你进一步的实施细节。
对于实现,我将根据您需要的内容来评估利弊。如果您还没有实现文本呈现系统,那么最好还是坚持简单的方法;还有比我这里列出的更多的文本呈现技术,比如将文本提交给多边形和其他库,这些库试图处理传统字体呈现技术中的一些问题,但您可能不需要任何复杂的技术。
对于使用哪种方法的建议,我将采用您最熟悉的技术,通常在OpenGL中从头开始执行需要更多的时间,但它可以为您提供一组更好的将来使用的功能。但是,如果Qt已经有了一些很好的东西来呈现标签(比如您提到的小部件),那么可能值得花时间学习如何使用它,因为它可能产生更快的结果,如果不需要的话,您也不想重新发明轮子。在这一点上,尽管使用OpenGL从头开始工作是非常有益的,并且极大地提高了您的理解,因为在没有抽象层可依赖的情况下,您必须熟悉事情是如何完成的。最终取决于你。祝好运!
https://stackoverflow.com/questions/54101679
复制相似问题