显示标签为“Computer - Graphics”的博文。显示所有博文
显示标签为“Computer - Graphics”的博文。显示所有博文

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 中被踢出来呢?这一直是一个谜,一定存在一些不可告人的秘密” 了。:-(

2004年11月8日星期一

3D 桌面与光影

LongHorn 的用户界面将包括 3D 桌面。既然是 3D 的桌面,我就在想,能不能把桌面本身也作为一个 3D 程序来对待呢?既然这样,我们就完全可以把很多目前只有在 3D 游戏里才有的特性加入到我们最常用的桌面上去吧?比如说,光影效果:

  • 试想一下,我们的桌面不再是一成不变的窗口层叠,而是像真正的窗外的阳光照射进来、在不同的窗口级层上产生光影效果;
  • 上面的窗口将真正的在下层窗口产生动态光影(可以参照 Doom3 的引擎嘛);
  • 当我们将桌面上方的一个光源摆放到桌面的左上角时,右下角的窗口将比左上角的窗口更暗;
  • 我们也可以摆设 2 个、3 个,更多个光源(只要硬件够强)在不同位置,将各个光源设置为不同的光源类型:点光源,射线光源,等等;
  • 每个光源的位置也是 3D 的,我们可以以桌面所在的平面为基准的 X-Y 平面;
  • 甚至,我们可以将桌面这个平面像窗口一样进行 3D 上的平移、旋转,而设置相关光源是按照绝对坐标不变化,还是按照桌面平面的相对坐标进行移动。

当然,发挥想象力,还可以有更多的特性。不过,这里也有一些具体的问题:比如从属桌面的子 3D 程序(我们现在的 Windows 的 3D 游戏都是桌面的子 3D 程序,只不过有些全屏,有些不是),它们的光照必然会与桌面的相冲突。我们可以设置隐藏的 Tag,标识非 DirectX(仅仅举个例子)程序,使桌面光源对它们无效。

2004年9月12日星期日

DirectX 的进展 (2)

前段时间玩了一下 DOOM 3,那个革命性的游戏。对于 DirectX,我也越来越感兴趣。但是不可否认的,DOOM 3 还是达不到那种绝对的真实,虽然它的光影效果已经是这个星球诞生以来最好的了。其实我很早就有一个想法,可以完完全全地模拟出真实的世界。我设想真正的绝对的粒子系统。我们首先创造出一些原子,赋予他们应该有的真实的物理属性,将它们合理地组合,然后它们就构成了真实的物体,就像我们这个真实的世界一模一样。当然,我们当前的计算机不可能做得到这一点,粒子的数量太多,处理量太大。但我们又不得不去处理。

今天我又想到,我们为什么、凭什么必须要去处理呢?如果我们必须要处理我们创造出来的粒子们,那么上帝是不是也得去处理他亲手创造出来的粒子们呢?事实上,它只是把它们创造出来了,规定了它们的属性和规律,然后就不再管了,就像你说的,“仅仅提供可能”。那么我们能不能也仅仅创造、让 CPU 的电子去管它们呢?当时我想到这一点的时候很兴奋,但马上想到一点:我们根本不可能创造真正的物体,我们只能模拟,说服我们的眼睛。

并且,从实现这个的“原子系统”的角度来看,也是很困难的。我们不得不自己创造一门新的语言,无疑的,DirectX 和 OpenGL 是不可能提供对这个的支持的,我们也完全不用现在的 DirectX 它们的那些特性。设想一下吧,我们现在想画一条直线,我们要做的就是创造一条原子束,将它们置于一个无任何外力的真空中,如此而已。

虽然困难重重,但是我敢断言,今后的电脑游戏的发展会越来越与物理结合起来,创造更真实的世界。

2004年8月26日星期四

DirectX 的进展 (1)

今天看到 Mesh 了,还是挺不容易的。虽说现在还在很基础的渲染上,但好歹现在也可以画一个会转会反光的三角形了。

到目前为止,最大的问题仍是 DirectX 那繁复的命令,有些确确实实既不好记,更不知道到底有什么用。把这些换成其他的也没有任何变化,但有时明明感觉是正确的代码,却达不到希望的效果。

而至今还没有搞懂的问题是:Normal。Normal 应该是法线吧,那么每一个平面的法线向量应该是相同的吧。但是第一个问题是,Normal 是在 Vertex 上定义的,那么,当这个 Vertex 是几个面的一个交点时,Normal 应该写成哪个面的法线向量呢?比如:一个正四面体,使用 TriangleStrip 方法画出,那么任意一个顶点都是三个面共用。如果我将某个面的三个点的 Normal 都写成这个面的法线向量,那么就只有这一个面会亮;如果将 4 个点的 Normal 写成从四面体中心指向外,那所有面都不亮!难道说,只能用 TriangleList 的方法,定义 12 个点吗?!

第二个问题,就是 Normal 向量。按理说,法线应该是一个物体表面指向外的垂直射线。但 DirectX 在计算光亮的时候是“计算光的方向向量与法线向量的夹角,角度越小越亮”。那么一个球的所有表面法线岂不是都是指向圆心的?

一幅截图,很简陋:

2004年8月13日星期五

开始学习 DirectX

从小就热衷游戏,想来最早的游戏机还是在我 4 岁的时候买的。长大了,热爱编程了,依然不减多少对游戏的喜爱。说实话,这就是我想学 DirectX 的目的,至少是最初目的。我从不为什么事而去做什么事,这次也绝不为了学 DirectX 而学 DirectX。

没有买书,就到网上找教程。下了 SDK,结果是 9.0b 的,9.0c 还没出,也凑合着用,反正也是 Managed DirectX。不过 9.0b SDK 的帮助中关于 DirectDraw 的部分并没有说 DirectDraw 已经被微软 Deprecated 了,所以就先在 http://www.thecodeproject.com/ 找到一篇从 DirectDraw 开始教的教程。自己照模照样写下来,嘿,还真能改变分辨率了,也能弄全屏了。接下来研究了一个晚上,做了一个用 Surface 重叠形成的动画效果,简陋,但还是挺兴奋的。

9.0c 的 SDK (Summer 2004) 出了。装上后才发现 DirectDraw Deprecated 的事,就改向 Direct3D,2D 能做的 3D 都能做。这一次的教程是 http://www.pluralsight.com/craig/articleview.aspx/DirectX/Direct3D 。和 SDK 自带的教程几乎一模一样,不过,SDK 带的好像少了一两条语句,而这个可以调通,解释也详细一些。花了 2 个下午,在圣桑小协的音乐中把 VertexBuffer 做的三角形画出来了。不错,继续努力吧。

其实我为什么要现在才开始学 DirectX 呢?并不是现在才感兴趣的,根本原因还是现在编程能力的提高和对 .NET 的逐渐熟悉。就像双簧管一样,很多事都得到了一个阶段后才能接触、感悟这一个阶段的东西,如果未到而又要强求,不但毫无作用,还可能适得其反,用金庸的话说,“走火入魔”。我们对事物的熟练程度是跳跃式的,不是平滑的。常常几年没有任何进步,但到了应该的时候,便会有极大的飞跃。我的经验告诉我应该是这样的,音乐是,编程是,英语也是。

万物终当以和为贵。