嗨@Artic,我不是Qt 专家,所以我无法为您提供有关小部件的信息,但我可以为您提供一些使用OpenGL 创建标签的指导。在这里给出一个完整的实现是很棘手的,因为它很大程度上取决于你想要如何显示文本。但我会尝试概述您的一些选择。
为了在 OpenGL 中渲染文本,大多数人使用一种称为位图字体的技术,请在此处查看更多信息:
https://learnopengl.com/In-Practice/Text-Rendering
位图字体的概念相当简单,所有字符都预先光栅化为纹理,然后您可以根据需要的字符从纹理的每个部分进行采样。你用四边形构建你的标签,用你为每个字符采样的位图的每个部分进行纹理化。
有符号距离场基本上使用相同的技术,但字符的预光栅化纹理是使用有符号距离场呈现的,它处理了标准位图字体所具有的一些问题。
在基本术语中,SDF 的工作原理是生成一个特殊的字体纹理或图像,存储从每个字符的边缘到其中心的距离,使用图像的颜色通道来记录数据。
如果您使用有符号距离场,仅从位图中采样是不够的,以这种方式渲染的字体需要额外的工作(通常使用着色器程序完成)才能产生正确的渲染。
一旦你有了生成标签的方法,你就可以决定是在屏幕空间还是在世界空间中显示它。
如果您想在世界空间中显示它(标签悬停在模型或项目上),如果您希望该标签始终面向相机,则需要做更多的工作,这种技术称为广告牌。
如果您只想在屏幕空间中将一些文本呈现到屏幕上,您也可以“即时”呈现您的文本。您可以使用像 SDL_ttf 这样的库。
见:http://lazyfoo.net/tutorials/SDL/16_true_type_fonts/index.php
在此示例中,您使用 SDL_ttf 将文本字符串渲染到具有您选择的尺寸的表面,然后您可以从该表面创建 OpenGL 纹理并将其渲染到屏幕上。
很抱歉,如果此信息有点宽泛,我需要一个更具体的问题来为您提供进一步的实施细节。
对于实施,我会根据您的需要评估利弊。如果您之前还没有实现用于呈现文本的系统,那么最好坚持使用简单的东西;文本渲染的技术比我在这里列出的要多,例如将文本转换为多边形和其他库,它们试图处理传统字体渲染技术的一些问题,但您可能不需要任何复杂的东西。
对于使用的建议,我会使用您觉得最舒服的技术,通常在 OpenGL 中从头开始做事情会花费更多时间,但它可以为您提供更好的功能集以供将来使用.但是,如果 Qt 已经有一些不错的东西可以渲染标签(例如您提到的小部件),那么可能值得花时间学习如何使用它,因为它可能会产生更快的结果,并且您不想重新发明轮子,如果你不需要。需要注意的是,尽管使用 OpenGL 从头开始做事情会非常有益,并且可以极大地提高您的理解力,因为当您没有依赖抽象层时,您必须熟悉事情是如何完成的。最终取决于你。祝你好运!