关于c ++:多个SFML OpenGL Windows

Multiple SFML OpenGL Windows

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

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

顺便说一句,您可能想知道为什么这样做可能有用:

对于物理学家来说,能够向其他人展示系统的动画是非常有用的,因为我们经常想对某些东西进行演示以帮助我们对其进行解释。一个简单的例子是盒子中气体颗粒的行为。在我们的幻想物理学计算中,在窗口中可以绘制粒子并像在现实世界中一样移动,在另一个窗口中,可以绘制图形以显示框内的总能量或平均粒子速度(温度)。和其他这样的事情。另一个很好的例子是对太阳系的模拟。关于行星的数据可以绘制到一个窗口,而太阳系的视图可以绘制到另一个窗口。


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

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

其次,为两者实现一个调整大小的方法。这样的事情会做。

1
2
3
4
5
6
7
8
9
10
11
/// 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);

现在另一个:

1
2
3
4
5
6
7
8
9
10
11
/// 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绘制方法绘制到每个窗口之前,需要为每个窗口调用resize函数。

现在是有趣的部分。在绘制之前,为要绘制到的窗口调用resize方法。然后,如果需要调用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就足够了,尽管它并不那么好...