要学习和/或使用哪些OpenGL版本?


16

因此,我是OpenGL的新手...我具有游戏编程的一般知识,但几乎没有实践经验。

我一直在研究各种文章和书籍,并尝试深入研究OpenGL,但是我发现各种版本以及旧的与新的处理方式令人困惑。

我想我的第一个问题是,是否有人知道可以运行每个版本OpenGL的游戏玩家所占的百分比。市场份额如何?2.x,3.x,4.x ...

我了解了Half Life 2的要求,因为我知道Valve用OpenGL将其更新为可以在Mac上运行,并且我知道他们通常会吸引非常广泛的用户群,并且他们说至少要有GeForce 8系列。我在Nvidia网站上查看了8800 GT,其中列出了对OpenGL 2.1的支持。也许我是错的,对我来说听起来很古老,因为已经有了4.x版本。我查了一下8800GT的驱动程序,它说它支持4.2!有点不一样,大声笑。

我还读过类似的文章,例如XP仅支持特定版本,或者OS X仅支持3.2或其他各种东西。总体而言,我只是对各种版本有多少支持以及要学习/使用哪个版本感到困惑。

我也在寻找学习资源。到目前为止,我的搜索结果使我指向了OpenGL SuperBible。第4版在Amazon上获得了好评,但它教授2.1。第五版讲授3.3版本,并且在评论中有几点提到第四版更好,而第五版没有正确地讲授新功能或其他内容?基本上,即使在学习材料中,我也看到差异,我什至不知道从哪里开始。

据我了解,3.x开始了一种全新的工作方式,我读过各种文章和评论,它们都希望“远离已弃用的功能,例如glBegin(),glEnd()”,但还有很多书我见过的教程都使用该方法。我见过一些人在说,基本上,新的做事方式比较复杂,而旧的做事方式不好。

就个人而言,我只是想补充一点,但我对镶嵌技术很感兴趣。所以我想这也是其中的原因,因为据我了解,这仅在4.x中?

[顺便说一句,我的桌面支持4.2]


这个问题(关于堆栈溢出)似乎是重复的:stackoverflow.com/questions/6823371/…–
安德森·格林

Answers:


21

如果您想了解OpenGL的覆盖范围,Steam硬件调查是一个不错的起点。

http://store.steampowered.com/hwsurvey?platform=pc

不幸的是,它现在似乎已经坏掉了,并且没有显示视频卡的任何统计信息。:\

我也读过类似XP的内容,仅支持特定版本

DirectX 9可与OpenGL 2.1相媲美,DirectX 10可与OpenGL 3.0相媲美,而DirectX 11可与OpenGL 4.0相媲美。这就是混乱的根源。

XP支持所有版本的OpenGL,但不支持DirectX 10或更高版本。这就是Microsoft想要迫使人们升级到Vista的方式,但是效果不是很好。OpenGL是一个开放标准,因此只要视频卡制造商愿意为XP生产驱动程序,它将支持较新版本的OpenGL。

据我了解,3.x开始了一种全新的工作方式,我读过各种文章和评论,它们都希望“远离已弃用的功能,例如glBegin(),glEnd()”,但还有很多书我见过的教程都使用该方法。我见过一些人在说,基本上,新的做事方式比较复杂,而旧的做事方式不好。

对于OpenGL,这是一个很大的问题。基本上,在过去,您会使用“立即模式”将内容发送到视频卡。开始glBegin,做一些事情,结束glEnd。然而,视频卡驱动程序不喜欢这个在所有。他们怎么知道您要发送多少东西?一个带纹理的四边形将是4个顶点,一个蒙皮模型将是100,000个?这就是为什么他们引入了顶点缓冲对象(VBO)的原因。当立即模式是一个链表时,VBO是一个静态数组。开发人员知道它的大小,驱动程序知道它的大小。大家都开心 因此,OpenGL标准委员会(Khronos Group)决定弃用OpenGL 3.0及更高版本的即时模式。但是,这是有问题的,正如我将通过一个简单的示例所示。

假设您要从头开始显示纹理四边形。

在OpenGL 2.1中:

  • 设置投影矩阵并将其放入 GL_PROJECTION
  • 设置模型视图矩阵并将其放入 GL_MODELVIEW
  • 加载图像并将其放入 GL_TEXTURE_2D手柄中。
  • 定义顶点的位置,纹理坐标和颜色。
  • 绑定纹理。
  • glBegin... glVertex2f... glTexCoord2f... glEnd

在OpenGL 3.0中:

  • 为投影和模型视图建立矩阵。
  • 加载图像并将其放入 GL_TEXTURE_2D手柄中。
  • 定义顶点的位置,纹理坐标和颜色,然后将其放入VBO。
  • 创建一个顶点数组对象(VAO)并附加您的VBO。
  • 编写一个着色器以输出带纹理的四边形并将其放入着色器程序中。
  • 使用制服将矩阵附加到着色器程序。
  • 绑定纹理。
  • 将纹理附加到着色器程序。
  • glDrawArrays

那么在第一个版本中可能出什么毛病?

  • 您的位置不正确。
  • 您的顶点缠绕是错误的方法。
  • 您的纹理无法正确加载。
  • 您的纹理无法正确绑定。
  • 您的投影矩阵是错误的。
  • 您的模型视图矩阵是错误的。
  • 您没有发送正确的顶点。

而在第二个版本,你可以有上述问题

  • 您的VBO错误。
  • 您的VAO错误。
  • 您的着色器错误。
  • 您绑定到着色器的纹理是错误的。

没有适当的调试工具,这将成为一个严重的问题。这就是为什么人们说您应该坚持立即使用模式的原因。幸运的是,我们现在有了免费且出色的gDEBugger,但这不是魔术。

要回答您的问题:这取决于您的游戏。如果您想吸引更广泛的受众(例如休闲游戏或2D平台游戏),则应定位2.1。如果您要制作的史诗般的太空游戏无论如何都不能在使用了六年的硬件上运行,请以3.3为目标。而且,如果您需要最新和最大的兼容性,可以使用4.0。


2
我认为您在这里对VAO / VBO表现出一些偏见。实际上,如果要绘制带纹理的四边形,则将具有完整的VAO / VBO集,以及已经创建的着色器和纹理(在程序启动期间-没有人在运行时创建它们)。实际上,通过新方法绘制纹理四边形仅需少量调用-诚然,它在程序初始化时就将复杂性提前加载,而旧方法在运行时暴露了复杂性。
Maximus Minimus

2
但这正是我的意思:现在您的错误可能在数据(顶点数据和纹理对象),着色器程序,着色器代码,矩阵,统一上传或VAO绑定中。如果您从开始什么,这是一个很大的子系统来检查的!而且您必须跟踪更多状态。
knight666

1
请注意,来自gremedy站点的gDEBugger已过时。我认为他们的论坛已经关闭很长时间了,所以我放弃了。该工具已被AMD收购:gDEBugger
MichaelHouse

2
“ glBegin ... glVertex2f ... glTexCoord2f ... glEnd。” 就是不行。glBegin,glVertex等永远都不对。glDrawArrays在OpenGL 1.1(1997)中引入,应始终在glBegin和End上使用。
API-Beast

9

有关硬件兼容性的一些统计信息,请查看Steam调查:http : //store.steampowered.com/hwsurvey/尽管列出了DX10和DX11,但硬件兼容性分别与OpenGL 3和OpenGL 4相同。但是请注意,人的OpenGL驱动程序安装状态通常比DX差。

Windows XP不支持DX10或DX11,但是OpenGL 3和4应该可以,只要驱动程序正常即可。OSX支持OpenGL 3(最大程度),在Linux上,您将获得带有ATI / NVIDIA供应商驱动程序的OpenGL 4(当然只有在硬件支持的情况下)。

然后还有OpenGL的移动ES版本。实际上,我建议您使用OpenGL ES 2.0,因为它更小,更容易学习,但是您还需要使用现代实践,即着色器和VBO。它也是大多数移动设备上使用的东西(因此您可以从事移动游戏的开发),并且WebGL基本上是相同的,因此您可以凭借其快速的开发优势实际上在Web浏览器中进行所有学习。OpenGL ES 3.0将于今年夏天发布。

镶嵌是OpenGL 4.0的功能。您应该首先学习其他种类的着色器,更不用说所有基础知识了,但是我同意这很有趣-实际上,我已经用它编写了一些测试:http : //blog.tapiov.net/post/15189341463/playing-与opengl-4-镶嵌


4
该死,knight666用更详细的答案击败了我。尽管如此,ES部分还是值得考虑的。
Tapio
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.