我如何创build两个SFML窗口,然后使用OpenGL绘制到他们两个?
如果您想知道如何创build和使用两个或更多的OpenGL的SFML窗口,那么这里就是解决scheme。 我无法find有关如何在互联网上的其他任何地方这样做的信息,所以在这里。 我希望这有助于某个人。
顺便说一句,你可能想知道为什么这可能是一个有用的事情要做:
物理学家能够向其他人展示系统的animation是一个非常有用的事情,因为我们经常想要编写一些演示来帮助我们解释它。 一个微不足道的例子就是一个盒子里的气体粒子的行为。 在窗口中,由于我们奇特的物理计算,粒子会像在现实世界中一样被绘制和移动,在另一个窗口中,可以绘制图表来显示框内的总能量或平均粒子速度(温度)和其他这样的事情。 另一个很好的例子就是太阳系的模拟。 有关行星的数据可以绘制到一个窗口,太阳系的视图可以被吸引到另一个窗口。
做这个工作需要几个步骤。 巧妙地设计了多个窗口,事实上你必须调整每个窗口的大小,或者至少这是最简单的方法。 只有一个窗口,您只能在窗口创建后重新调整大小,并且每次调整大小或重新调整大小。 你可能会争辩说,有更好的方法来做这个通过推动和从矩阵栈弹出,在这种情况下,请评论并留下其他答案。
首先,您需要声明两个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绘图方法绘制之前调用每个窗口的调整大小功能。
现在是有趣的部分。 在绘制调用你要绘制的窗口的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
就足够了,虽然它不是很好…