我是3D OpenGL / DirectX世界的新手,我发现OpenGL 4.1和GLSL规范今天才发布。
我的一个朋友给了我《 OGL v2.1红皮书》,但是据我所读,3.x和4.x与2.x有很大的不同,现在已经淘汰了许多东西。
我可以使用这本书来开始学习3D和CG的基础知识,还是找到更新的副本更好?
我是3D OpenGL / DirectX世界的新手,我发现OpenGL 4.1和GLSL规范今天才发布。
我的一个朋友给了我《 OGL v2.1红皮书》,但是据我所读,3.x和4.x与2.x有很大的不同,现在已经淘汰了许多东西。
我可以使用这本书来开始学习3D和CG的基础知识,还是找到更新的副本更好?
Answers:
在这样的时候,我总是去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功能。
我建议用2.1和3还有很多的硬件和驱动程序只支持OpenGL 2.1的交叉坚持,而是由OpenGL的3核心鼓励的做法是更好的。本教程是一个很好的起点(学习OpenGL 2.0,但不包含3中已弃用的功能)。
我会说这不是没有用的。
为什么?好吧,尽管世界其他地区都支持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仍然有用,并且将保持相当长的一段时间。
mh01的答案涵盖了很多基础知识,因此我将添加一些补充。
让我们谈谈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的。在attribute
和varying
关键字没有在3.3内核存在; 它使用in
and 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确实有所收获。
简短的答案:
不需要。学习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
应避免使用其他固定功能的灯光功能。glBegin
,glVertex
,glColor
,glEnd
:避免他们。可能适合快速实验,但还有其他更好的方法可以进行相同的实验。我最初在这个答案中发布的问题原来是重复的,因此我将其重新发布在这里。
我建议您先学习现代知识,然后假装直到您需要时才发现不存在。
在某些情况下,过时的东西可能在某些情况下很有用,例如,如果您尝试编写仅支持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的视口以及不使用着色器进行渲染。这样一来,您无需一劳永逸地学习。
但是除此之外,如果可能的话,应该跳过它。