在Mac OS X中,有没有一种简单的方法使用C++打开一个或多个OpenGL窗口?

3
是的,我讨厌Objective-C,而且我的项目将是可移植的,所以我想尽可能多地使用C++进行编码,最好达到100%。
因此,我使用Xcode创建了一个常规的C++项目,并希望打开一些OpenGL窗口。
编辑:该死,使用glutMainLoop()会接管应用程序的控制权,而我希望能够更多地控制循环。
我将尝试使用freeglut,虽然我找不到OSX二进制文件,并且我总是运气不佳,无法编译别人的代码。
更新:
我又尝试链接到SDL 1.3,这次我终于可以使它工作!哎呀呀!
我一直想使用SDL,但使用多个窗口是必须的,而这是1.3版本正在开发的功能,我从未能使其正常工作。
由于它可在数百个操作系统上移植,并且可以处理2D图形以及OpenGL,所以我选择了它。谢谢大家!

2
不要讨厌我的最爱编程语言!只需尝试远离C++一周,仅使用Objective-C编码整整一周,那么在那之前的一周将是你最后一次使用C++。 - user142019
哈哈,谢谢。但是这个项目我想保持它的可移植性,说实话,当我尝试学习 ObjC 时,它的语法真的让我很头疼。 - Petruza
2
你为什么要避免使用Objective-C呢?把3%的项目用Objective-C实现,剩下的97%用C/C++实现并不会对你造成致命的影响。 - Adam Rosenfield
好的,你可能是对的,但这个问题不是关于ObjC的。编写特定于OSX的代码意味着当移植到Windows时,我将不得不编写糟糕的代码。使用一个为我处理OpenGL窗口的可移植库会很棒。 - Petruza
记录一下,那是我过去的自己在说话,我现在更深入地学习了Objective C,而且我真的很喜欢它。 :D - Petruza
4个回答

3

如果你不想使用Objective-C,那么你只能使用已弃用的Carbon库、X11或者类似GLUT的其他库来创建窗口。如果可移植性是一个问题,那么选择GLUT路线,否则你需要为每个要支持的平台编写自己的窗口管理代码。

如果你不选择GLUT路线,那么你需要为每个操作系统编写窗口管理代码,所以我强烈建议你在Objective-C++中编写窗口管理。你唯一需要知道的就是指针始终是指针,无论使用哪种语言,所以只需将Objective-C IDs存储为void*并将它们转换回IDs即可,这实际上非常容易。


2

是的,在我的Windows时代早已使用过,现在打算重新体验一下。 - Petruza

2

GLUT对于你所述的目的很好,但你可能希望有一个漂亮的C++包装器。我最终自己动手写了一个,虽然GLUT不太友好,但还是可以做到的。

编辑:由于你在glutMainLoop()上遇到了问题,你可能正在尝试做比GLUT设计更多的事情——它主要用于hack、一次性项目和OpenGL演示。而且freeglut在Mac上不能编译OOB,至少我的经验是如此。

对于一个便携式的、功能更全面的应用程序,Qt可能是你的选择。否则,为可移植性设计你的C++,并在每个平台上使用一个薄的GUI层。如果在每个平台上运行某些东西最重要,那么选择前者。如果在每个平台上获得最佳用户体验最重要,那么选择后者。你可能会发现,“薄”并不是描述所涉及内容的最恰当的术语。

我发现这个演示对于让一个简单的Cocoa/OpenGL窗口工作很有用,尽管代码有很多荒谬的错误:http://developer.apple.com/library/mac/#samplecode/CocoaGL/Introduction/Intro.html


你的意思是在C语言外面再套一层吗?我还是喜欢纯C。 - Petruza

1
这个问题已经被问了3年,但仍然很新鲜。我最近为规划学校课程进行了类似的练习,并尝试找出在Mac/Windows/Linux/mobile上使用OpenGL项目的最佳便携式库。也许我的笔记会帮助某人做出决定。我只提到了我考虑过的主要选项。 更高级别的API,用于窗口管理和其他好处,如精灵、字体、声音、事件处理等:
  • SFMLgithub repo:漂亮整洁的C ++面向对象库,可以与OpenGL原生集成。在MacOS、Win和Linux上直接支持管理窗口和OpenGL 3.3上下文的可移植性。移动支持在2.2分支(github)中提供。
  • SDL2:支持所有主要平台,包括移动平台。OpenGL上下文需要手动管理,因此例如使用GLEW非常方便(见下文)。比SFML低级一些。
较低级别的API,主要用于窗口和OpenGL上下文管理:
  • GLFW:这基本上是现代OpenGL的GLUT替代品。相当低级,但可在Win、OSX、Lin之间移植。正在积极开发中。
  • GLEW:我只是为了完整性而提及它。它不管理窗口,但有助于管理OpenGL上下文,例如,您可以将其与GLFW或SDL一起使用。
其他:
  • Freeglut:GLUT的开源延续版。适合小型演示项目。我自己没有使用过它,但看到了很好的文档和演示代码。正在积极开发中。
  • GLUT:旧版本已停止。网络上有遗留的演示和代码。

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