2006年2月19日星期日

初窥 OpenGL

最近买了一本 OpenGL 的书,似乎很有名,叫 《OpenGL 超级宝典》(OpenGL SuperBible)。差不多看到第四章了,感觉书写得不错,翻译也过得去(经常去 China-Pub 看到那些人在骂译者翻译得烂,当然在西红柿和鸡蛋中也能偶尔见得到一两本说翻译得好的。不过总觉得,如果我这里写“翻译也很不错”,那就有一种鸡蛋不久将临的感觉)。

因为原来也学过 DirectX,所以看到这本书时,还是燃起了对 3D 编程的热情,总还是想比较一下 OpenGL 和 DirectX。很早就听说过 OpenGL,也总是听闻它的效率在很多时候要高于鼎鼎大名的 D3D,或者至少不会比 D3D 更低吧。不过在心中总还是觉得 OpenGL 这个名词闪耀着神秘的光芒,一直不敢去碰它。当然,很大的原因是出于对 C 语言本身的畏惧的。以前用 DirectX 也是用的它的 Managed 版,用 C# 编。现在想起去年拿着自己一个人编了 3 个月的所谓的 “3D引擎” 去参加软件大赛,结果灰头土脸回来的感觉,一方面觉得自己太过骄傲和不自量力,另一方面也觉得 DirectX,即使是 Managed DirectX 也还是太繁杂。就是到参赛的当天凌晨,我都还在为怎么样打开全屏模式而不会出现 Exception 而苦恼。总之,DirectX 给我留下的印象不好。

不过话又说回来,那段时间也不是白学了,至少我对 Viewport, Cull 这些名词,矩阵操作,纹理和碰撞这些概念都有了实际的接触。现在再来看 OpenGL,发现好像一切都还是那么亲切。我不是专门搞图形的,对那些复杂的数学不仅是小学,就是现在大三了都还是既不喜欢也不强悍。但我是一个游戏迷,我想这个理由就足够我去研究图形接口了。

OpenGL 和 DirectX 最大的区别,我觉得在于 DirectX 是微软一家发明和维护的技术,而 OpenGL 仅仅是一系列的接口(API),具体实现是各个公司和个人(如果可能的话)去做的。这样,同一个 OpenGL 游戏使用微软的 OpenGL 库和使用 SGI 公司的库可能有很大的区别。(总还是感觉微软的 Win32 API 是那么地名不副实,自己写一套借口,自己实现,还不准别人去实现,这叫什么接口?不就是一个 Public 函数么?)

OpenGL 的结构好像比 DirectX 更简洁,简洁到让人怀疑它能不能完成程序员们需要的功能。打个比方,DirectX 就像 C++,面向对象;OpenGL 就像 C,面向过程。大家都知道 C++ 是 C 的超集,但没人怀疑 C 是最适合系统编程的语言之一。从第一印象来说,比起 DirectX,我更喜欢 OpenGL(大家都知道人们往往对第一次接触的东西印象最好)。正如 OpenGL SuperBible 里面讲到的,“John (Carmack) 证明了为了完成相同的任务(渲染一些三角形),OpenGL 只需要使用 10 行左右的代码,而 Direct3D 则需要 2 到 3 页的代码”。

目前的打算是,有时间用 OpenGL 重新写一次上次软件大赛的参赛作品,倒时候再来讨论 OpenGL 应该更有说服力了。

另外,似乎 Microsoft 已经被踢出 OpenGL ARB 了,看来我也无缘看到书中所说的 “Microsoft 如此大胆地进行误导,为什么它还没有从 ARB 中被踢出来呢?这一直是一个谜,一定存在一些不可告人的秘密” 了。:-(

没有评论: