如何在OSX上运行OpenGL

13

我通常在Windows上进行编程,但是学校给了我一台MacBook Pro,所以我正在尝试为OSX制作一个OpenGL应用程序。我下载并安装了XCode,但我不知道如何启动一个简单的OpenGL应用程序。我更喜欢不使用Objective-C,但我绝对不想使用GLUT。有人能指点我方向吗?

6个回答

12
在 OS X 上,OpenGL 与其他操作系统最大的不同之处在于头文件的位置。
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>

如果你想避开Objective-C/Cocoa和GLUT,可以尝试SDL,它是一个跨平台的游戏库(Windows、2D图形、声音、输入等)。
编辑:我忘记了编译器标志,mipadi发布了,即:
-framework OpenGL

1
我正在考虑使用SDL。我之前在一个学生项目中使用过它。但是我想学习创建窗口并初始化OpenGL所需的步骤。我不想通过Interface Builder或Cocoa自动为我创建窗口。 - Ernesto Rojo Jr
看起来我要选择SDL路线。似乎找不到我想要的东西。 - Ernesto Rojo Jr
1
好的, Cocoa 是 Mac OS X 开发的 API,所以我不确定这是如何 "automagic" 的。你使用 Cocoa 在 OS X 中创建窗口,就像你使用 Windows API 在 Windows 中创建窗口一样。 - Niki Yoshiuchi
1
正确,我指的是Interface Builder创建nib的方式,而NSApplicationMain使用它来魔法般地创建窗口。如果我可以手动创建窗口而不使用IB,那就太好了。之后的下一步是创建OpenGL上下文并使用它进行绘制。我正在寻找这个过程,但是针对mac。我不希望有任何事情对我隐藏。我想逐步看到创建过程。 - Ernesto Rojo Jr
1
啊,我懂了。我相信直接做这个是可能的,但可惜,我的OS X开发知识基本为零。我只知道如何运行OpenGL和SDL,从那里开始基本上与任何其他平台都一样。不过,我找到了一系列关于在没有NIB的情况下开发OS X应用程序的博客文章:http://lapcatsoftware.com/blog/2007/05/16/working-without-a-nib-part-1/。 - Niki Yoshiuchi
您可以在Mac OS X上使用与其他平台相同的OpenGL基元来创建窗口。 - mipadi

7

这个问题在互联网上已经非常老了,但是最简单的方法就是涉足 Objective-C 语言... 对不起。

我的一般处理方式如下:

  • 你可以继续使用 C++ 进行所有核心编程,没有问题。
  • 在 XCode 中创建一个新的“Cocoa 应用程序”。
  • 在界面构建器中(编辑 .xib 文件的地方),在对象浏览器中找到一个 NSOpenGLView 对象,并将其拖到窗口上。
  • 这一点很重要:在对象检查器中更改子类为自己的子类(仍需创建)。你可以随意命名,例如 MyRenderer 或其他任何名称。
  • 按 [cmd]+[n] 键,创建一个新的 Objective-C 类,MyRenderer。
  • 重要! 将 MyRenderer.m 扩展名改为 MyRenderer.mm。这样,XCode 就知道它必须编译 Objective-C++ 而不是 Objective-C。
  • 在 MyRenderer.mm 中,至少要重写 NSOpenGLView 的以下方法。
    • - (void) awakeFromNib:在此处进行类初始化。不要在此处初始化 OpenGL,否则程序将崩溃。
    • - (void) drawRect:(NSRect)dirtRect:在此处进行绘图。
    • - (void) prepareOpenGL:在此处初始化 OpenGL。
    • - (void) reshape:(NSRect)bounds:用于当视图被调整大小时。

好消息是,你可以在 MyRenderer.mm 中自由地混合 C++ 函数和类。 你还可以使用 C++ 的 #include 指令以及 Objective-C 的 #import 指令。你可以在 drawRect 中做任何 C++ 的事情,没有问题。

坏消息是,NSOpenGLView 不会每隔 x 毫秒重绘 场景。它只有在觉得必要的时候才会重新绘制场景。你需要使用 Cocoa 的 NSTimer 类来实现。

编辑:额外说明:在 drawRect 方法中,请确保调用 glFlush() 以及 [[self openGLContext] flushBuffer]。由于某种原因,只调用 [[self openGLContext] flushBuffer] 不会在我的视图上绘制任何内容。


2
我一直在使用这个网站作为我的Windows、Mac和Linux项目的参考。作者提供了很多好的示例,可以帮助你在所有平台上开始自己的项目。最终目标是,你需要使用Objective-C来创建窗口,并且可以使用C++编写其余的代码。请参考http://ysflight.in.coocan.jp/programming/fssimplewindow/e.html

1

在 Mac OS X 上使用 OpenGL 时,有两件事需要记住:

第一,你必须链接 OpenGL 框架。在 Xcode 之外,你可以向链接器传递 -framework 标志:

$ gcc -framework OpenGL -o my_opengl_program my_opengl_program.c

(请注意,此标志仅适用于OS X。)
如果您正在使用Xcode,则可以将OpenGL.framework添加到链接的框架中。
其次,您需要在OpenGL头文件前面加上OpenGL/前缀。例如,要包含gl.h,请使用:
#include <OpenGL/gl.h>

否则,在 Mac OS X 上使用 OpenGL 进行编程基本上是一样的。

我认为你没有理解问题的精神。我很确定,在完成上述操作后,我不会调用wglCreateContext。我要找的是创建窗口并将OGL上下文附加到它的骨架代码,或者一些伪代码来解释该过程。 - Ernesto Rojo Jr
既然 wglCreateContext 是特定于 Windows 的(据我所知),那么在 Mac OS X 上,您不会使用它。但是,您可以仅使用 OpenGL 函数来编写 OS X 上的OpenGL程序。 - mipadi
没错,我知道OpenGL函数不会改变。那不是最初的问题,但你提供的一些信息肯定是相关的,所以谢谢你。 - Ernesto Rojo Jr
1
你最初的问题是如何在不使用Objective-C的情况下在OS X上运行“简单的OpenGL应用程序”。 - mipadi

1

如果你在 Mac 上进行编程,你可以使用任何你熟悉的语言。XCode 支持编译 C++,因此如果你在 Windows 上熟悉 OpenGL,那么这是一个简单直接的过渡,但是你需要使用适当的方法来创建 OSX 窗口(很可能是 Cocoa)。

如果 Python 是你的菜,PyOpenGL 是一个跨平台的 Python 绑定 OpenGL。


您可以使用OpenGL原语直接创建/处理窗口(无需通过Cocoa)。 - mipadi

0
非Objective-C库是AGL

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