使用OpenGL和GLUT,我想从两个不同的视点渲染场景。对于第一个视点,它是使用着色器的标准透视投影。对于第二个视点,它是深度缓冲区的可视化。我希望这两个图像并排放在同一个窗口中。
到目前为止,我一直在使用GLUT进行显示。例如,我使用:
glutInitWindowSize(1000, 1000);
glutInitWindowPosition(500, 200);
glutCreateWindow("OpenGL Test");
这将在我已定义的一个视口的整个窗口中绘制我的场景。但是,如上所述,我可以使用GLUT从两个不同的视口中绘制两个不同的图像吗?或者这对于GLUT来说也不是那么容易,我需要在我的操作系统中本地创建一个窗口(我正在使用Ubuntu),然后在该窗口中定义两个不同的区域,我应该利用它...
谢谢!
答案 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)
总是可以选择将两个视图渲染到单个纹理中,然后简单地将屏幕尺寸设为四边形并将该纹理渲染到四边形上。
我不确定它是否满足您的所有需求,但从视觉角度来看,这应该会给您相同的结果。