今天学习OpenGL 2.1没用吗?


44

我是3D OpenGL / DirectX世界的新手,我发现OpenGL 4.1和GLSL规范今天才发布。

我的一个朋友给了我《 OGL v2.1红皮书》,但是据我所读,3.x和4.x与2.x有很大的不同,现在已经淘汰了许多东西。

我可以使用这本书来开始学习3D和CG的基础知识,还是找到更新的副本更好?


10
我对OpenGL / DirectX不太了解,但我确实喜欢在已经使用了一年多的计算机上玩游戏。我以为您知道3.x之前的OpenGL对我的游戏习惯会有所帮助。只是一个想法。
Simurr,2010年

我不喜欢这个问题的措辞方式。 您可以在OpenGL 2.1中制作游戏吗?答案:肯定的。那没用是什么意思呢?您可以从旧书或过时的API中学习3D的基础知识吗?再次是肯定的。这是做最好的最好的方法吗?可能不是
bobobobo

Answers:


18

在这样的时候,我总是去Steam硬件调查:http : //store.steampowered.com/hwsurvey/-您会发现DX10 / 11类系统的市场渗透率接近80%;这大致相当于GL3.3或更高版本。这80%的用户仅限于Vista / 7用户-在带有XP的DX10 / 11 GPU中添加,您的使用率上升到90%以上。

请记住,我们在这里谈论的是更多的硬核玩家,那么您需要开始考虑您的目标受众。这些是您要针对的人吗?您是针对那些硬件级别较低的用户吗?英特尔显卡呢?Mac和Linux用户呢?这些都是您需要自己回答的问题,因此从广义上讲,通用准则是您最好的选择。

除此之外,您还需要考虑以下事实:如果您今天开始学习并打算运送某些东西,那么在到达之前至少要等待大约一年的时间(除非我们正在谈论关于真正的琐碎/简单案例)。随着gfx功能的持续上升趋势,到那时我们正在真正接近GL3.3 +硬件的100%普及。

然后考虑到GL2.1或更低版本,即使您将自己局限于GL2.1的着色器和VBO子集,您仍将要学习并使用很多老旧的废话(低级GLSL版本很讨厌使用,并且如果没有GL_ARB_map_buffer_range,流式VBO几乎将无法使用)-GL3.3 +引入处理许多事情的更好(且性能更高)的方法,您将更好地利用播放器的硬件(感谢他们为为此,您将花费更多的时间来编写高效的代码,而不是使用确实不希望与您合作的API。

当然还有可怕的驾驶员情况。困难但真实的事实是Windows上的GL驱动程序处于令人遗憾的状态-NV支持他们不应该支持的东西,AMD不支持他们应该支持的东西,而对于Intel,您确实需要将自己限制在具有GL功能的地方在D3D中等效。GL_VERSION越新,您越有可能遇到驱动程序错误,但对于GL3.3,现在情况相当稳定。

因此,总结是,在没有任何其他信息(目标受众等)的情况下,我将GL3.3作为基准(可能从更高的GL_VERSIONs中获取了可用的功能,并且不会破坏代码库)除非有非常明确的明确确定的理由将价格调低(我想绝对100%地确定这一点,而不是使用一些模糊的概念,使用较旧硬件的人呢? ”)。在后一种情况下,我不会低于GL2.1,即使那样,我也希望尽可能多地引入3.x功能。


GL3.3〜= DX10 / 11和Steam硬件统计的重点。
Nate 2012年

只是为了更新这些统计信息-DX10 / 11 GPU + Vista / 7现在的价格约为88%,DX10 / 11 GPU + XP的价格又增加了4.38%,并且您所看到的渗透率相当可观地超过90%。吸收量的增长速度比我发表原始帖子时的预期要快得多。
Maximus Minimus 2012年

“ GL3.3 +引入了处理许多事情的更好(且性能更高)的方法”-3.2票价相比如何?Mac用户尚未获得3.3版本。我一直假设它几乎是相同的,但不想承担太多。
michael.bartnett 2012年

38

我建议用2.1和3还有很多的硬件和驱动程序只支持OpenGL 2.1的交叉坚持,而是由OpenGL的3核心鼓励的做法更好的。本教程是一个很好的起点(学习OpenGL 2.0,但不包含3中已弃用的功能)。


3
+1为Joe Groff教程。他将带领您完成第二章的整个流程。他添加的任何“实用程序”代码只有两个功能:一个用于读取文件(对于GLSL)和一个用于读取TGA图像(您也可以使用另一个)图片库或编写示例后即可编写自己的图片加载器)。其他所有内容均已说明,并且是本教程的一部分。
michael.bartnett

18

我会说这不是没有用的。

为什么?好吧,尽管世界其他地区都支持OpenGL 3.x和4.0,但Mac OS X仍仅支持OpenGL 2.1。而且,在大多数(如果不是全部)便携式平台上使用的OpenGL ES在所有版本(1.0、1.1和2.0)上仍得到广泛支持。它们分别大致可与OpenGL 1.4、1.5和2.1媲美。

因此,直到OpenGL ES 1.0完全从地球表面消失之前,知道OpenGL 2.x 不会浪费。

当然,这并不是说在支持OpenGL 3.x或4.0的平台上使用它没有任何价值。

更新:从Mac OS X Lion(10.7)版本开始,Mac现在支持OpenGL 3.2 Core配置文件。此版本弃用了OpenGL 1.x的大部分内容,以简化API。使用旧版OS X(和低端Intel图形)的用户仍限于OpenGL 2.0和2.1。尽管如此,了解OpenGL 2.x仍然有用,并且将保持相当长的一段时间。


Snow Leopard确实支持OpenGL 3的大多数扩展-甚至包括几何着色器。
Axel Gneiting 2010年

@Alex支持“多数”扩展并不表示支持核心GL3。我们只是在谈论3.x
Matias Valdenegro,2010年

@Axel Gneiting:就是不一样。OpenGL 3.0+的大多数有趣功能都不能作为扩展使用。有许多核心变化。
greyfade

12

mh01的答案涵盖了很多基础知识,因此我将添加一些补充。

OpenGL ES

让我们谈谈ES 2.0,桌面GL 2.1和桌面GL 3.3。为了便于讨论,术语“ GL XY”将指桌面OpenGL版本XY,而“ ES XY”将指OpenGL ES XY

从结构上讲,与GL 2.1相比,ES 2.0与核心GL 3.3有更多的共同点。GL 3.3和ES 2.0均基于纯着色器。它们都是基于纯缓冲对象的。GL 2.1等具有许多性能和编码陷阱,这使得编写GL 2.1应用程序变得容易,而该应用程序不容易移植到ES 2.0。

但是,就着色语言语法而言,GLSL ES 1.00(映射到ES 2.0)看起来更像是GL 2.1的GLSL而不是GL 3.3的。在attributevarying关键字没有在3.3内核存在; 它使用inand out,当您处理两个以上着色器阶段时,这将更加一致和合理(这就是为什么ES 3.0采用GL 3.3语法的原因)。

将GL 3.3中学习到的概念映射到ES 2.0 很容易。因此,如果您学习GL 3.3的各种工具,您将了解如何在ES 2.0世界中工作。当然,您需要弄清楚子集的位置(即GL 3.3可以做到ES 2.0无法做到的事情),但是概念是相同的。

映射GLSL的语法,以便您可以将着色器从一个复制到另一个,有点困难。但实际上,只需要在正确的位置进行几个#define。另外,GLSL 3.30具有一些ES兼容性功能,诸如此类highp(在桌面GLSL中不起作用)。

因此,从GL 3.3(而不是GL 2.1)学习时,对于ES 2.0确实有所收获。


8

对于不需要对OpenGL进行较大更改(仅在较新版本中公开)的游戏,仅使用3.x +会将您限制为nvidia 8系列及更高版本(不确定要在其他图形供应商上查找)。因此,如果您不使用3.x +功能,则只是在创建人为的限制,阻止具有较旧但功能强大的图形卡的人玩游戏。

因此,我强烈建议学习前向兼容的子集和较新的版本,然后选择可以有效地将您的游戏推入其中的最低版本。您可以

在回答另一个问题时,我还将注意到OpenGL:ES 2.0删除了固定功能管道,因此它与3.0等效于2.1,并且在运行时始终根据所支持的gl版本支持不同的功能。


4

我想说,使用您的《红皮书》学习OpenGL是省钱的,只是忽略那些在较新版本中不推荐使用的东西(例如glBegin(),glEnd()-使用VBO代替)。在通过扩展之前,较新版本中的大多数功能已经可用。


4

我大部分都同意这种说法。但是我不会完全忽略不推荐使用的API:仍然有太多使用它们的代码。不过,我会给予他们较少的关注。例如,毫无意义地学习glBegin(),glEnd()足以使用它们编写自己的代码。但是,当您看到它们时,您应该识别它们,并对它们在做什么有所了解。

即使您不构建示例代码并进行涵盖OpenGL 3.x中已终止功能的练习,仍然值得至少阅读一遍整个《红皮书》。


3

简短的答案:

不需要。学习OpenGL 2.1是一个好主意,即使在今天,只要您学习“好的部分”。

长答案:

OpenGL本质上可以分为两部分:“好的部分”和“旧版功能”。

老实说,在学习遗留功能(“固定功能”)方面我没有看到太多好处。但是,OpenGL 2.1的大部分(优秀部分)今天仍然可用,但变化相对较小。

因此,学习OpenGL 2.1的某些部分可能会有所帮助。特别是,如今OpenGL ES 2非常流行,ES 2 大部分(但不完全是)OpenGL 2.1的子集。对于智能手机中的3D编程,必须使用OpenGL ES 2。

那么什么是“好”?基本上是OpenGL 3.x“核心配置文件”(与“兼容性配置文件”相对)和/或OpenGL ES 2中的任何内容。

  • 顶点和片段着色器:了解它们
  • 质地:还是不错的。
  • 矩阵:了解它们的工作方式是有益的,但是glLoadIdentity那种功能已经过时了,应该避免
  • 灯光:了解如何在计算机图形学中模拟灯光是有用的,但是glLightfv应避免使用其他固定功能的灯光功能。
  • 数组缓冲区:好
  • glBeginglVertexglColorglEnd:避免他们。可能适合快速实验,但还有其他更好的方法可以进行相同的实验。
  • 显示清单:避免

我最初在这个答案中发布的问题原来是重复的,因此我将其重新发布在这里。


1

我不认为这是一个坏主意。许多GL概念涉及所有OpenGL版本,并且最终仍会为您提供帮助。我有10年前的许多OpenGL书,这些书今天仍然有用。我想说的是,如果您是OpenGL的新手,并且有一些更好的旧书,您将学到很多东西,并且代码仍然可以使用。大部分OpenGL是向后兼容的(我相信)。


1

我建议您先学习现代知识,然后假装直到您需要时才发现不存在。

在某些情况下,过时的东西可能在某些情况下很有用,例如,如果您尝试编写仅支持OpenGL 1.5或更旧版本(可以在较旧的上网本和较旧的MacOS系统上找到),OpenGL ES 1.x(较旧的iPhone)的程序和Android 1.6之前的版本)或OpenGL SC(如果您正巧在喷气式战斗机上编程显示器,则为Saftey Critical子集)。例如,Minecraft是基于OpenGL 1.3构建的,因此它可以支持真正的旧硬件(但即使它确实具有“高级”选项)。

如果您只想在屏幕上获得像素,而不关心以“正确”的方式进行操作,它也很有用。

学习时依赖于OpenGL默认情况下会执行的某些功能很有用,例如设置-1.0到1.0的视口以及不使用着色器进行渲染。这样一来,您无需一劳永逸地学习。

但是除此之外,如果可能的话,应该跳过它。

我建议您在此处此处查看我的答案,以获取更深入的信息。

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.