使用GLUT渲染多个视口

时间:2015-12-28 04:02:00

标签: user-interface opengl glut

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

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:4)

GLUT最终与它无关。它创建并管理一个窗口。你在那个窗口中做什么完全取决于你。

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

所以你打电话给import UIKit class ViewController: UIViewController, UIPageViewControllerDataSource { var pageViewController: UIPageViewController! var harishStoryboard:UIStoryboard! override func viewDidLoad() { super.viewDidLoad() self.harishStoryboard = self.storyboard // Do any additional setup after loading the view. self.pageViewController = harishStoryboard.instantiateViewControllerWithIdentifier("HarishPageViewController") as! UIPageViewController self.pageViewController.dataSource = self let initialViewController = harishStoryboard.instantiateViewControllerWithIdentifier("HarishIntroduction") as! HarishIntroduction let viewController = NSArray(object: initialViewController) self.pageViewController.setViewControllers(viewController as? [UIViewController], direction: .Forward, animated: false, completion: nil) self.pageViewController.view.frame = self.view.bounds self.addChildViewController(pageViewController) self.view.addSubview(self.pageViewController.view) self.pageViewController.didMoveToParentViewController(self) } func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { if viewController.isKindOfClass(HarishIntroduction) { return nil } if viewController.isKindOfClass(HarishPlaces) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("HarishIntroduction") as? HarishIntroduction return correctViewController } /*if viewController.isKindOfClass(WyomingSeminary) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("HarishPlaces") as? HarishPlaces return correctViewController } if viewController.isKindOfClass(AppleTree) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("WyomingSeminary") as? WyomingSeminary return correctViewController } if viewController.isKindOfClass(KearneyHighSchool) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("AppleTree") as? AppleTree return correctViewController } if viewController.isKindOfClass(MosconeCenter) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("KearneyHighSchool") as? KearneyHighSchool return correctViewController }*/ else { return nil } } func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { if viewController.isKindOfClass(HarishIntroduction) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("HarishPlaces") as? HarishPlaces return correctViewController } /*if viewController.isKindOfClass(HarishPlaces) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("WyomingSeminary") as? WyomingSeminary return correctViewController } if viewController.isKindOfClass(WyomingSeminary) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("AppleTree") as? AppleTree return correctViewController } if viewController.isKindOfClass(AppleTree) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("KearneyHighSchool") as? KearneyHighSchool return correctViewController } if viewController.isKindOfClass(KearneyHighSchool) { let correctViewController = harishStoryboard.instantiateViewControllerWithIdentifier("MosconeCenter") as? MosconeCenter return correctViewController } if viewController.isKindOfClass(MosconeCenter) { return nil }*/ else { return nil } } } ,指定窗口的一半。然后你在那一半渲染你想要的东西。然后你拨打glViewport来指定另一半。然后你渲染你想要的东西。然后你就完成了;只是交换缓冲区。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

总是可以选择将两个视图渲染到单个纹理中,然后简单地将屏幕尺寸设为四边形并将该纹理渲染到四边形上。

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