【问题标题】:Multiple SFML OpenGL Windows多个 SFML OpenGL 窗口
【发布时间】:2012-12-13 20:32:31
【问题描述】:

如何创建两个 SFML 窗口,然后使用 OpenGL 绘制到这两个窗口?

如果您想知道如何通过 OpenGL 创建和使用两个或多个 SFML 窗口,那么这里就是解决方案。我无法在互联网上的其他任何地方找到有关如何执行此操作的信息,所以在这里。我希望有一天这对某人有用。

顺便说一句,您可能想知道为什么这可能是一件有用的事情:

对于物理学家来说,能够向其他人展示系统动画是一件非常有用的事情,因为我们经常想要编写一个演示程序来帮助我们解释它。一个简单的例子是盒子中气体粒子的行为。在一个窗口中,由于我们花哨的物理计算,粒子将像在现实世界中一样被绘制和移动,而在另一个窗口中,可能会绘制图表以显示盒子内的总能量或平均粒子速度(温度)和其他类似的事情。另一个很好的例子是太阳系的模拟。关于行星的数据可以绘制到一个窗口,而太阳系的视图可以绘制到另一个窗口。

【问题讨论】:

    标签: c++ windows opengl sfml


    【解决方案1】:

    完成这项工作需要几个步骤。多个窗口的巧妙之处在于您必须在绘制每个窗口之前调整其大小,或者至少这是最简单的处理方式。对于一个窗口,您只能在创建窗口后调整大小,并且每次调整大小或调整形状。您可能会争辩说,通过从矩阵堆栈中推送和弹出来执行此操作有更好的方法,在这种情况下,请发表评论并留下其他答案。

    首先,您需要声明两个 sfml 窗口,正如您所期望的那样:sf::Window window, window2;(您可能应该检查它们是否在程序执行结束时也都关闭了!)

    其次,为两者实现一个调整大小的方法。这样的事情就可以了。

    /// Window
    glViewport(0, 0, window.GetWidth(), window.GetHeight());
    // Set matrix mode back again
    glMatrixMode(GL_PROJECTION);
    // Reset matrix stack
    glLoadIdentity();
    // Set drawing surface properties - either Perspective or Orthographic
    ///gluPerspective(45.0, (double)w / (double)h, 1.0d, 100.0d);
    glOrtho(-50.0d, 50.0d, -50.0d, 50.0d, -10.0d, 10.0d);
    // Put matrix mode back
    glMatrixMode(GL_MODELVIEW);
    

    现在是另一个:

    /// Window2, which can be different to window!
    glViewport(0, 0, window.GetWidth(), window.GetHeight());
    // Set matrix mode back again
    glMatrixMode(GL_PROJECTION);
    // Reset matrix stack
    glLoadIdentity();
    // Set drawing surface properties - either Perspective or Orthographic
    ///gluPerspective(45.0, (double)w / (double)h, 1.0d, 100.0d);
    glOrtho(-50.0d, 50.0d, -50.0d, 50.0d, -10.0d, 10.0d);
    // Put matrix mode back
    glMatrixMode(GL_MODELVIEW);
    

    您可能希望将这两个代码块放在两个不同的函数中,并可能实现您选择的相机类。这样做的原因是,在使用各种 OpenGL 绘图方法绘制到每个窗口之前,您需要为每个窗口调用调整大小函数。

    现在是有趣的部分。在绘制之前调用要绘制到的窗口的调整大小方法。然后,如果您需要致电 glMatrixMode(GL_MODELVIEW);(以防万一!)、glLoadIdentity();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);。显然,如果你不想清屏,就不要调用glClear或者glLoadIdentity,如果你不想重置矩阵变换栈...

    现在开始你的绘图:glBegin()glEnd() 以及你需要做的所有其他事情。

    最后,请致电window.Display()window2.Display(),具体取决于您正在向哪一个绘图。现在回到上面有趣的部分,为另一个窗口调用 resize 方法,继续为第二个窗口做所有你需要做的事情,就像第一个窗口一样!

    现在享受多窗口的 OpenGL SFML 编程。您可能还想将大量窗口放入矢量或其他精美容器中。

    [编辑] 由于某种原因 sf::Windows 是不可复制的,这意味着您不能将它们 push_back() 放入像双端队列或向量这样的容器中。这可能是由于某些 OpenGL 特定的事情,如果您尝试将所有位从一个窗口类复制到另一个窗口类,这将“出错”。 (也许?)相反,sf::Window* = new sf::Window[number_of_windows]unsigned int number_of_windows = 2 就足够了,虽然它不是那么好......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2014-08-12
      • 2012-12-16
      • 2018-10-16
      • 2021-05-12
      相关资源
      最近更新 更多