【问题标题】:How should I implement sub-windows in my OpenGL viewport?我应该如何在我的 OpenGL 视口中实现子窗口?
【发布时间】:2014-03-13 03:49:42
【问题描述】:

我应该如何在我的 OpenGL 视口中实现子窗口?在我的视口内,我想在左侧为标签保留一些空间,并在边缘周围保留一些空间作为边框。我已经计算出了所有坐标,并且一切都正常显示。我的问题是将溢出到其他子窗口的东西剪裁在一个子窗口中。我似乎无法弄清楚 OpenGL 3.3 的核心上下文做事方式是什么。是不是

  • 使用逐顶点剪辑?
  • 剪刀测试?
  • 模板测试?
  • 将帧缓冲区与窗口的不同部分相关联?

我应该查看哪些命令?

【问题讨论】:

  • 使用glViewport (...) 限制您的帧缓冲区中几何体投影到的区域。剪掉或刻掉屏幕的一部分会降低效率,而且您会丢失信息——有点像电视上的缩放图片模式。每顶点裁剪也无济于事,您需要在原始级别进行裁剪才能执行此类操作。
  • @AndonM.Coleman:谢谢你的回答,但你确定会剪辑吗? opengl.org/discussion_boards/showthread.php/…
  • 当然它不会剪切任何东西,视口映射发生在剪切之后。裁剪主要由您的投影矩阵定义,视口只定义了被裁剪的几何图形被光栅化到的屏幕区域。为了简化这一点,它定义了已经裁剪的几何图形如何被拉伸以填满你的屏幕。
  • @AndonM.Coleman:抱歉,我实际上显示的一切都很好。我的问题实际上是剪辑。我会让我的问题更清楚。
  • 我仍然建议为每个子窗口使用不同的投影矩阵和视口。这是因为在较新版本的 GL 中,您可以在几何着色器中使用视口数组。这样子窗口真的很容易实现,而且您不必担心模板测试或剪裁,因为如果您为每个子窗口正确设置投影矩阵,剪裁就已经完成了。

标签: opengl opengl-3


【解决方案1】:

在我花时间写一个完整的答案之前,我希望您确认这就是您在原始问题中所描述的内容:

*---------------------------------------*
| ------------------------------------- |
| |   |                               | |
| |   |                               | |
| |   |                               | |
|C| A |              B                |C|
| |   |                               | |
| |   |                               | |
| |___|_______________________________| |
*---------------------------------------*

A = Labels
B = Main Window
C = Border

【讨论】:

  • 是的,就是这样。但是我自己设置矩阵没有问题。我的问题是当我画到 B 时,它会溢出到 A 和 C,我需要剪辑那个输出。
  • 另外,请不要担心边界,因为我认为这可能会使您的解决方案复杂化——只要弄清楚如何将 A 和 B 分开就足以让我继续实施这一点。谢谢。
  • 要清楚,当您绘制到 B 时,您使用的是具有子窗口 B 边界的投影矩阵?如果是这种情况,剪裁就会被破坏。裁剪在 OpenGL 中的工作方式是,如果在投影后图元中的任何顶点具有 > Clip.W 或 this page 了解更多详细信息,并忽略图中的术语viewport(此图仅在您假设视口与投影矩阵具有相同尺寸时才有效)。
  • 在本例中,假设 B 的宽度为 100,高度为 30。您可以使用 left=0,right=100,top=0,bottom=30 的正交投影矩阵。现在,让我们假设子窗口 B 相对于 整个 父窗口(由 C 勾勒)的原点位于 50,20。您可以将glViewport (...) 与 X=50,Y=20,height=30,width=100 一起使用。您在子窗口 B 中绘制的任何内容都将与窗口的原点相关,而不是与整个窗口相关。因此,对于每个子窗口,您都有自己的坐标系。
  • 是的,这与这个问题并不真正相关。但这就是我更喜欢考虑每个窗口的投影矩阵/视口而不是使用剪刀矩形或设置模板缓冲区的原因(但如果您想要非矩形窗口,这可能很有用)。视口数组的有趣之处在于,您可以渲染一个对象一次,然后使用几何着色器将几个不同的视图吐出到屏幕上的不同位置——这对于经常将同一模型的视图沿不同轴嵌入到单个窗口。
猜你喜欢
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
相关资源
最近更新 更多