多个SFML OpenGL窗口

3

如何创建两个SFML窗口,并使用OpenGL在两个窗口中绘制?

如果您曾经想知道如何使用OpenGL创建和使用两个或更多个SFML窗口,那么这里就有解决方案。我在互联网上没有找到任何其他关于如何实现此功能的信息,因此在此提供给大家。希望这对某些人在某些时候有所帮助。

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

对于物理学家来说,能够向他人展示系统的动画非常有用,因为我们经常想要编程演示某些东西来帮助我们解释它。一个微不足道的例子是盒子中气体粒子的行为。在一个窗口中,粒子将根据我们的复杂物理计算以及在现实世界中移动而被绘制出来,在另一个窗口中,则可以绘制图表以显示盒子内部的总能量或平均粒子速度(温度)等其他信息。另一个很好的例子是太阳系的模拟。可以将有关行星的数据绘制到一个窗口中,将太阳系的视图绘制到另一个窗口中。

1个回答

2
这需要几个步骤才能实现。多窗口的复杂之处在于您必须在绘制之前调整每个窗口的大小,或者至少这是最简单的方法。对于一个窗口,您只需在创建窗口后调整大小,并且每次调整大小或改变形状时。您可能会认为通过从矩阵堆栈中推入和弹出来做这件事会更好,在这种情况下,请评论并留下其他答案。
首先,您需要声明两个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(),具体取决于您刚刚绘制的窗口是哪一个。现在回到上面的有趣部分,并为另一个窗口调用调整大小方法,并像第一个窗口一样继续执行所需的所有操作!
现在享受使用多个窗口进行OpenGL SFML编程。您可能还希望将大量窗口放入向量或其他高级容器中。
[编辑]由于某些原因,sf::Windows是不可复制的,这意味着您无法将它们推入类似deque或vector的容器中。这可能是由于一些特定于OpenGL的事情,如果尝试从一个窗口类复制所有位,则会出现“错误”。因此,sf::Window* = new sf::Window[number_of_windows]unsigned int number_of_windows = 2就足够了,虽然不太好看......

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接