【问题标题】:How do you determine when an object is drawn on-screen in OpenGL?如何确定何时在 OpenGL 中在屏幕上绘制对象?
【发布时间】:2011-01-25 07:52:39
【问题描述】:

我对 OpenGL 非常陌生。我正在编写一个在屏幕上显示飞行 3D 文本的程序。我需要知道某些文本字符串何时出现(绘制)到屏幕上并且对用户可见。程序需要识别显示哪些文本字符串。 (注意:虽然我的问题涉及文本,但它可以推广到任何 OpenGL 对象)。

起初,我开始认为我可以使用 OpenGL 的选择机制,但到目前为止,我只看到了选择区域专注于某种用户交互的示例。我想知道整个窗口区域上显示了哪些对象。这让我觉得我走错了路……我错过了什么吗?

欢迎提出任何建议。

【问题讨论】:

    标签: opengl 3d picking text-rendering


    【解决方案1】:

    嗯,它实际上是 3D 的吗?还是只是二维空间中屏幕上的二维文本?在那种情况下,我只会手动跟踪它。你到底是怎么画你的文字的?

    通常您执行此操作的方式是使用“平截头体检查”,您基本上只是为相机制作一个体积并测试您是否在其中是否有 3d 对象。

    【讨论】:

      【解决方案2】:

      你可以试试 OpenGL 的 feedback 机制。在这种模式下,OpenGL 生成片段并将它们传递到反馈缓冲区。如果剪裁了某些东西,则不会生成任何片段。当文本变得可见时,您将在片段缓冲区中找到相应的片段。

      这个link 应该让你开始。

      这是另一个链接,Question 10.010 似乎与您想要的特别相关。

      【讨论】:

      • 最新的 GL 版本中是否不推荐使用反馈?
      • 是的。它已被弃用。 OpenGL 着色器现在可以“导出”任何有关几何图形的信息,实际上 glFeedback 不再需要了。
      【解决方案3】:

      通过projection and modelview matrices 运行对象坐标以获取屏幕空间坐标。将 X/Y 输出与屏幕范围进行比较,以确定文本是否在屏幕上。

      【讨论】:

        【解决方案4】:

        您可以使用查询对象(特别是那些使用 GL_ARB_occlusion_query 扩展 Specification 创建的对象)。这些对象用于查询使用一系列 OpenGL 操作(开始/结束等)渲染了多少片段。

        另一种方案(仅限软件)是为渲染的文本确定一个边界框,然后以数学方式计算边界框是否在视锥体内(源自用于渲染的当前透视图。

        注意:使用 OpenGL 拾取 并不一定意味着使用 gluPickMatrix。您可以“按原样”渲染场景,并查询渲染的名称(OpenGL 3 不推荐使用 altought Pick)。

        查询对象易于使用,而且它们是轻量级的。对于大多数硬件来说,拾取是另一种很好的解决方案,但比查询对象更简略。

        【讨论】:

          猜你喜欢
          • 2021-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-04
          • 2020-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多