【问题标题】:Rendering Multiple Viewports using GLUT使用 GLUT 渲染多个视口
【发布时间】:2015-12-28 04:01:59
【问题描述】:

使用 OpenGL 和 GLUT,我想从两个不同的视点渲染一个场景。对于第一个视点,它是使用着色器的标准透视投影。对于第二个视点,它是深度缓冲区的可视化。我希望这两个图像并排包含在同一个窗口中。

到目前为止,我一直在使用 GLUT 进行显示。例如,我使用:

glutInitWindowSize(1000, 1000);
glutInitWindowPosition(500, 200);
glutCreateWindow("OpenGL Test");

这将为我定义的一个视口在整个窗口中绘制我的场景。但是,如上所述,我可以使用 GLUT 从两个不同的视口绘制两个不同的图像吗?或者,仅使用 GLUT 就不是那么容易了,我需要在我的操作系统中本地创建一个窗口(我使用的是 Ubuntu),然后在该窗口中定义两个不同的区域,我应该在这些区域上绘制......

谢谢!

【问题讨论】:

    标签: user-interface opengl glut


    【解决方案1】:

    GLUT 最终与它无关。它创建和管理一个窗口。您在该窗口做什么完全取决于您。

    您需要做的是使用viewport transform。因为视口发生在裁剪之后,所以不会渲染视口变换范围之外的图元(drawing commands。缓冲区清除仍将清除整个帧缓冲区)。这有效地定义了所有顶点所在的窗口区域。

    所以你调用glViewport,指定一半的窗口。然后你在那一半渲染你想要的东西。然后调用glViewport 指定另一半。然后你在那里渲染你想要的东西。然后你就完成了;只是交换缓冲区。

    但是,这也意味着在 GLUT 调整大小回调中仅调用 glViewport 的典型策略将不起作用。您必须存储窗口的当前大小,然后在显示函数中使用它。

    【讨论】:

    • 谢谢。事实上,我还希望能够注册特定于各个子窗口的鼠标回调。我不认为 glViewport() 可以做到这一点,但我遇到了 glutCreateSubWindow() 这可能对我有帮助......
    • @Karnivaurus:只检查鼠标点击的区域不是更容易吗?这是一个矩形点测试;这甚至不难。
    • 好主意,容易多了哈哈!我不确定glutCreateSubWindow() 有什么用,也许如果你做的事情比我提议的要复杂得多......
    【解决方案2】:

    有两种方法可以做到这一点:

    • 您可以使用glutCreateWindow() 创建一个新窗口。请注意,这将具有不同的 OpenGL 上下文。还要注意它有一个返回值,一个整数。

    • 您可以使用glViewport() 选择窗口的一部分,然后再次调用glViewport() 以绘制到同一窗口的不同部分。

    【讨论】:

      【解决方案3】:

      始终可以选择将您的两个视图渲染到一个纹理中,然后简单地制作一个屏幕大小的四边形并将该纹理渲染到您的四边形上。

      我不确定它是否能满足您的所有需求,但从视觉角度来看,这应该会给您带来相同的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-22
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多