OpenGL是否适合2D游戏?


44

我已经自学了一段时间的OpenGL库,并想开始制作游戏。但是,为了更简单的介绍,我想从2D开始,例如自上而下的Pokemon风格的游戏。

这是一个好计划,还是OpenGL专为3D设计?



我认为将OpenGL用于2D的好处之一就是您可以获得着色器的好处。这些对于实现特殊效果可能是有用的。另一个好处是,如果您已经了解OpenGL,那么您将已经熟悉该API。
Lysol

Answers:


44

OpenGL非常适合2D游戏。尽管它通常用于3D,但相同的功能也可以用于2D游戏。也就是说,您可以使用3D OpenGL进行的任何操作都适用于“ 2D” OpenGL。

此位置可以找到一些进一步的信息。

以与3D OpenGL相同的方式实现2D OpenGL。2D OpenGL仅是一种技术的应用,即在平面上渲染场景,然后使用正射投影而不是透视投影,这取决于您的设置,可能会使场景变形。

一个例子:

正交与透视

(a)是正交投影中的场景。(b)是同一场景,使用透视投影。在2D游戏中,如果更改了精灵的深度,则可能导致精灵的位置错误(具体取决于您进行开发的方式)。使用透视投影还使对齐屏幕坐标中的内容变得更加困难。

此外,OpenGL具有很多很多好处。首先,硬件加速是一个巨大的优势。此外,还对图形卡的功能及其运行方式进行了更好的控制,从而可以针对特定情况进行优化


非常感谢你!我只想确认可以这样做。
w4etwetewtwet

4
如果您有能力和兴趣将OpenGL用于2D,它将为您带来很多只有OpenGL才能提供的奖励。出色的性能,跨平台兼容性...这样考虑。无论如何,几乎所有其他 2D选择都将建立 OpenGL 之上。这是裁减一些“中间人”的绝佳机会
Steven Lu

2
@StevenLu,更不用说了,他更像一个真正的程序员
Outurnate

伟大的阅读!感谢您的链接。是的:用直接的OpenGL编码2D 更加糟糕,这就是为什么要这样做。
史蒂文·卢

1
您应该为此答案提供更多信息,而不仅仅是链接。也许可以解释为什么GL适用于2D(正交视图)以及它带来了什么优势(硬件加速,着色器效果)。
肖恩·米德迪奇

22

顾名思义,OpenGL是一个图形库。尽管它是在考虑3d的基础上开发的,但是在库中没有要使用3d的硬编码假设。此外,由于具有3d功能,严格的2d方法很难做到的几件事是微不足道的。例子:

  • 通过使用3d坐标深度缓冲区简化了Z排序(不过请注意透明度)
  • 精灵旋转和缩放基本上是免费的,因为您使用的是与分辨率无关的纹理四边形
  • 如果您愿意将自己限制为支持OpenGL 2.0的图形卡,则可以利用着色器,这将大大简化编写特殊效果(模糊,颗粒效果,图像处理,颜色替换)的过程-更不用说它将比CPU端快很多

这只是我脑中浮现的几个优点,我想还有其他几个优点。


3
请限制自己使用支持OpenGL 2.0(或更高版本)的图形卡,OpenGL 2.0于2004年发布,即使这已经过时了。
Slicedpan

@Slicedpan,不幸的是,某些笔记本电脑/上网本仍带有支持GL 1.4 max的英特尔卡-我个人决定放弃它们,但有些人(尤其是在制作简单游戏时)可能希望支持它们。
Kornel Kisielewicz

16

尽管OpenGL是3D API,但是您仍然可以使用它来制作2D游戏。您可以通过各种技术在3D中伪造2D环境,例如将数据限制在平面上。

但是,实际API中以明显的方式(例如,没有“打开2D模式”功能)对此提供的支持有限。如果不了解引擎盖下实际使用的3D管道,可能很难完全理解模拟它的方法(可以在许多在线教程中找到)。

听起来您已经研究OpenGL已有一段时间了,所以您可能对这些基础知识有了相当的了解。但是,如果您对它们感到不满意,则可能需要使用构建在OpenGL之上的2D库(例如cocos2d)来开始游戏。如果您感觉自己还没有准备好独自解决整个问题,它将带给您一些2D API通常看起来应该是什么样的体验,并且仍然为您带来硬件加速的3D后端的好处。



5

许多2D图形库(例如SDLSFML)都使用OpenGL硬件加速。这为您带来了OpenGL的性能优势,但在更简单的API之后抽象了令人讨厌的低级细节。


0

我现在在OpenGl编程方面有很多经验,我可以告诉你这很痛苦。过去,当我开始编程时,在像BlitzBasic这样的简单环境中,我的工作效率很高。然后,我开始学习C ++和OpenGl。当您没有好的老师或人要问的时候,您将永远陷入黑屏。最大的问题是OpenGl的状态。您可以交换许多交换机来更改opengl的状态。并且某些开关依赖于其他开关。例如glGet(GL_TEXTURE_BINDING_2D)取决于glGet(GL_ACTIVE_TEXTURE)。以及哪个状态取决于哪个状态不是最好的文档。诸如纹理加载之类的许多操作都要求您更改此状态,这通常会导致需要旧状态的其他代码损坏。还有一个问题,OpenGl是依赖于实现的行为,因此您的程序在您的计算机上运行,​​但是在另一台计算机上,您看到的只是黑色。您在这里所能做的就是猜测10000行代码中出了什么问题。因此,如果您喜欢沮丧,则可以使用OpenGl处理2D内容。对于其他所有人,如果不需要,请不要这样做。您可以在OpenGl中提高工作效率,但这将花费您大量的时间和精力。可能比您想花的更多。您可以在OpenGl中提高工作效率,但这将花费您大量的时间和精力。可能比您想花的更多。您可以在OpenGl中提高工作效率,但这将花费您大量的时间和精力。可能比您想花的更多。


-2

Unity3D使用OpenGL,而我将其用于2D和2.5D平台程序。Unity3D本质上是3D游戏引擎,但也用于2D和2.5D游戏。您可以具有x,y,z平面,并且只能将移动或旋转限制为这些平面中的2个,从而在本质上是3D的世界中创建2D气氛。


太好了,我的第一张选票。很高兴看到gamedev也有仇恨。
Apollo软件

1
我猜想通过现实世界的例子来说明这一点是令人困惑的。很专业。
Apollo软件

7
顺便说一句,否决票并不表示“仇恨者”。不赞成投票只是社区表达他们对问题和答案的看法的一种方式。这对您而言不是私人的,因此请不要那样做。我同意下降投票者应该对下降投票的原因发表评论,因为您不知道如何在没有反馈的情况下改善答案。我会告诉你为什么我认为它被否决了。仅仅因为一个人将OpenGL用于2D游戏,并不意味着整体上是适当的。您还需要给出理由为,为什么它的合适。
MichaelHouse

2
是的,不确定为什么人们会投票否决;我感觉到的“使用OpenGL”位应与“在需要它的平台上使用OpenGL”加以澄清(它在iOS / Anrdoid / OSX / Linux以外的所有地方都使用Direct3D或特定于控制台的API),但这不是一个更正。
肖恩·米德迪奇

1
我没有投票反对,但是这个答案不合适的另一个原因是因为您使用的是基于OpenGL的引擎,而不是原始的OpenGL,这会改变很多事情。
w4etwetewtwet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.