gpt4 book ai didi

c++ - OpenGL 和 Qt : display a label on the mouseover

转载 作者:太空狗 更新时间:2023-10-29 21:32:42 26 4
gpt4 key购买 nike

我正在使用 OpenGL 和 Qt。我在 OpenGLWidget 中渲染场景。将鼠标悬停在场景中的对象上时,我想在所选对象附近显示一个带有一些文本的框。我已经实现了对象的选择。

我想到了两种可能的方法。

  1. OpenGLWidget 上方放置一个小部件(例如 QLabel)渲染场景。
  2. 直接在 OpenGL 中渲染四边形中的文本。

您推荐这两种方法中的哪一种,请给我一些实现建议。或者,您可以推荐另一种方法。谢谢!

最佳答案

您好@Artic 我不是 Qt 专家,所以我无法为您提供有关小部件的信息,但我可以为您提供一些使用 OpenGL 创建标签的指导。在这里给出一个完整的实现是很棘手的,因为它在很大程度上取决于你想如何显示文本。但我会尝试概述您的一些选择。

要在 OpenGL 中呈现文本,大多数人会使用一种称为位图字体的技术,请在此处查看更多信息: https://learnopengl.com/In-Practice/Text-Rendering位图字体的概念相当简单,所有字符都预先光栅化为纹理,然后您可以根据需要的字符从纹理的每个部分进行采样。你用四边形构建你的标签,用你为每个字符采样的位图的每个部分进行纹理化。

有符号距离场基本上使用相同的技术,但字符的预光栅化纹理是使用有符号距离场渲染的,它处理了标准位图字体存在的一些问题。

In basic terms, SDF works by generating a special texture, or image, of the font that stores the distance from the edge of each character to its centre, using the colour channels of the image to record the data.

如果您使用带符号的距离字段,仅从位图中采样是不够的,以这种方式呈现的字体需要额外的工作(通常使用着色器程序完成)以产生正确的呈现。

一旦您有了生成标签的方法,您就可以决定是要在屏幕空间还是在世界空间中显示它。

如果您想在世界空间(标签悬停在模型或项目上方)中显示它,如果您希望该标签始终面向相机,则需要做更多的工作,这种技术称为广告牌。

如果您只想在屏幕空间中将一些文本呈现到屏幕上,您也可以“即时”呈现您的文本。您可以使用像 SDL_ttf 这样的库。请参阅:http://lazyfoo.net/tutorials/SDL/16_true_type_fonts/index.php

在此示例中,您使用 SDL_ttf 将一串文本渲染到具有您选择的尺寸的表面,然后您可以从该表面创建 OpenGL 纹理并将其渲染到屏幕。

抱歉,如果此信息有点宽泛,我需要一个更具体的问题来为您提供更多实现细节。

对于实现,我会根据您的需要评估优缺点。如果您之前没有实现过渲染文本的系统,那么最好坚持使用简单的东西;文本渲染的技术比我在这里列出的要多,例如将文本转换为多边形和其他库,这些库试图处理传统字体渲染技术的一些问题,但您可能不需要任何复杂的东西。

关于使用的建议,我会选择您觉得最舒服的技术,通常在 OpenGL 中从头开始做事情会花费更多时间,但它可以为您提供一组更好的功能以供将来使用.但是,如果 Qt 已经有一些很好的渲染标签的东西(比如你提到的小部件),那么花时间学习如何使用它可能是值得的,因为它可能会产生更快的结果,而且你不想重新发明轮子,如果你不需要。请注意,尽管使用 OpenGL 从头开始​​做事可能会非常有益,并且会极大地提高您的理解力,因为当您没有可以依赖的抽象层时,您必须熟悉事情是如何完成的。最终这取决于你。祝你好运!

关于c++ - OpenGL 和 Qt : display a label on the mouseover,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54101679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com