OpenGL是跨平台的吗?如果不是,那么如何将游戏移植到其他平台?

18

好的,假设我正在使用C++和OpenGL编写一个游戏。游戏在屏幕上绘制一些简单的形状,例如正方形。现在假设我想在Windows上运行这个“游戏”,我该怎么移植它?实际上,C++不是问题,因为据我所知,它可以重新编译以适应环境。但是,对于openGL库的调用会出问题,对吗?实际上,用于开发的opengl库将被编译为操作系统,这将需要重新下载库,这将导致源代码需要修改。这会使得程序在原始环境中失效,对吗?

简而言之,有没有办法构建可在多个操作系统上运行的OpenGL游戏,而无需修改源代码以平台特定或下载外部包装器或库?


我认为你关闭问题的观点是不正确的。 - MehranTM
2个回答

27

OpenGL是独立于平台的,而不是跨平台的。它只是一个图形库接口规范,不涉及它被实现在哪个平台上。它只描述函数、它们的名称以及它们的功能。

特定的OpenGL库实现可能是跨平台的,也可能不是。例如,Mesa在主要针对Linux开发的同时,在某种程度上也是跨平台的。您需要找到各平台上的OpenGL实现才能进行编译。

然而,在开始使用OpenGL接口之前,有一些代码需要执行。这段代码用于设置OpenGL渲染上下文。如何设置是与平台相关的。例如,在Linux上,GLX是X窗口系统的扩展,提供了创建渲染上下文的接口。这只适用于运行X窗口系统的系统。在其他系统上,您将需要执行不同的操作来完成相同的工作。

有一些跨平台库可以为您完成创建渲染上下文的工作。例如,看看GLFW。它是一个现代化的替代库,但GLUT不再维护。您可以避免在源代码中编写与平台相关的代码,并将该任务交给库来管理。

请注意,OpenGL只提供了一个图形库。没有其他内容。游戏可能使用许多其他不独立于平台的库和接口,如输入、声音等。如果您的游戏只包含纯C++,并且唯一的库是OpenGL,则源代码在另一个平台上会非常顺利,只要您的C++代码不依赖于任何未指定的行为。如果使用类似GLFW这样的库,甚至可能无需更改渲染上下文设置。

值得一提的是像SFMLSDL这样的东西。这些库是跨平台的,并为各种多媒体提供接口。它们将设置您的OpenGL渲染上下文,为您创建窗口,绘制到屏幕上,处理I/O和声音等等。它们在某些方面可能会受到限制,但是它们功能强大,可以让您在所有平台上迅速达到很好的位置。


嗯,你的意思是说如果我想让游戏在另一个操作系统上可用,我需要切换到目标操作系统并重新编写项目,但要使用该平台的OpenGL实现? - pipsqueaker117
3
不是重新编码,而是重新编译。你可以编写包含特定平台代码的跨平台 C++ 代码,通常使用预处理器实现。例如,可以使用 #ifdef LINUX 包装某些仅适用于 Linux 的代码。构建系统通常提供了这样做的方法。(理论上也可以将代码编译成不同的目标平台,但这可能很麻烦。) - Joseph Mansfield
1
你总是需要重新编译项目。OpenGL 是一个规范,而不是一个库。例如,Nvidia 驱动程序通过驱动程序在 Windows、Linux 和 Mac OS X 上实现了这个规范。 - leemes
@pipsqueaker117 你最好使用一个可以抽象掉创建窗口等细节的库。对我来说,五年前这个库是GLUT,但现在可能有更现代化的替代品。 - James M
1
如果你使用跨平台库来完成所有事情,那么这并不像你想象的那样可怕。使用OpenGL的跨平台实现、用于设置渲染上下文和窗口的跨平台库、跨平台I/O库、跨平台声音库等等,你就可以顺利完成任务了。每当你认为需要编写特定于平台的代码时,很可能已经有一个库可以帮你完成它。 - Joseph Mansfield
显示剩余8条评论

4
是的,OpenGL是跨平台的。但是创建OpenGL渲染上下文、处理输入等代码通常不是跨平台的。

所以你的意思是,如果我将在 Mac 上编码的 OpenGL 项目复制到 Windows 上,并使用 Eclipse 进行设置,用 Windows 的 Lib 文件替换掉原来的文件,然后重新编译该项目,我就可以了? - pipsqueaker117
我在考虑使用C++和OpenGL。没有别的了。另外,当你说处理输入是跨平台的时候,你是说像键盘事件这样的东西需要为每个操作系统编写不同的代码吗?我不认为这是你的意思,但这是我能理解的全部内容... - pipsqueaker117
1
我认为键盘处理、音频和其他类似的事情正是K-ballo所说的。 - Mats Petersson
@pipsqueaker117:是的,那是我的意思,也是事实。创建窗口、接收输入(例如键盘/鼠标/触摸)和类似的操作需要为每个操作系统编写不同的代码。除非你在使用一个跨平台库的基础上构建,该库已经提供了每个操作系统所需的不同代码。 - K-ballo
哦,哇……我开始窥见游戏开发有多么让人噩梦了…… - pipsqueaker117
显示剩余2条评论

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