发信人: nhyjq(人类·木人桩)
整理人: nhyjq(2003-01-05 15:46:18), 站内信件
|
目 录
1.1 传统2D方法的简短概述
1.2 在DirectX 8.0中的改变
原文:2D Programming in a 3D World
作者:George Geczy [06.29.01]
译者:Gameart、Shary、Edward、Mays
版本:release 1.0
--------------------------------------------------------------------------------
所谓的“二维”编程时代已经结束了吗?一些(编程)种类的确已经步入黄昏 - [这里可能有转折之意]有程序设计员认为卷轴冒险游戏可能刚从长期昏迷中清醒。对于其他类型来说,3D环境并不是简简单单就能适用。就象Sid Meier的Alpha Centauri(以及他的文明系列),帝国时代,Talonsoft的战争艺术系列和红色警戒系列全部使用2D的界面及地图,效果很好。不是说这(2D游戏中)一切的东西都看起来是平面的,例如,帝国时代2和红色警报2就用细致的绘图,使得人员单位,建筑物和风景显得有纵深感。但是,它们的游戏引擎依然是2D的。再者,完全采用3D环境是否会减弱这些产品的可玩性,是大家激烈争论的话题。例如,Sierra的地面控制可以被看作是RTS(即时战略)概念的向3D环境的发展,但是,正是2D游戏的红警2击败了它,成为了最近一期IGN读者选出的2000年最佳战略游戏奖的得主。
红色警报的所有系列都使用2D界面的地图,但这不能说任何事物看起来都是扁平的。例如,红色警报2中的图形单元、建筑物、及地形都引用了深度概念。这使得它获得了很好视觉效果。
决定一个2D引擎是否可以很好的存活着,电脑游戏程序员需要面临3个问题:第一,Microsoft最近发行的DirectX集中加强了3D部分的支持,其次,游戏玩家对更高的图形质量及特殊的效果的要求的呼声越来越大。最后,2D程序员转型到3D图形API(象OpenGL及Direct3D)需要有一个学习的转变过程。当然,在Microsoft的DirectX 8.0及的更高版本中,提供一些特征帮助使您转变得更容易。
1.1、传统2D方法的简短概述
2D图形中最重要的概念就是精灵(sprite)。这很简单,2D引擎绘制一幅背景图象然后绘制单个图形 - 精灵 - 绘制到背景图象上。关键色的使用可允许精灵的某种指定色彩视为透明,其可让精灵(显示时)定义为任何不规则的形状。利用一系列的精灵描述一个对象,例如一个单元的动作由许多不同的饰面组成,当它(们)在顺序绘制时,就模拟出了动画及行动。2D图形基本的处理方法即是blit - 位块传送(bit block transfer)- 其用于将精灵位图移动到显示区域上。最后,提供了帧到帧光滑显示的转换。图形操作(首先位块传送)通常在后缓冲区进行,它通常就是工作屏幕区域的一个拷贝 - 帧一旦完全后,后缓冲区的内容就会填充到显示区域(前缓冲区),接着绘制下一帧。在2D图形处理过程中几乎所有事情都是在这些底层概念上被建立的。
在DirectX中,Microsoft提供一个功能很强(但有时也有限制)的2D图形接口,通常我们叫它DirectDraw。这个API满足了2D引擎的基本要求。DIRECTDRAWSURFACE 用来表示原始图形数据表面(负责背景图像或精灵)及主显示表面(前后缓冲区)。这些表面(surfaces)可以定义在显存或是系统内存之中(当然前缓冲区比较例外,它总是指向显存)。DirectDraw的Blt()命令常用于表面间整体图像或是部分图像的移动。DirectX中没有提供Sprite支持,你可以建立一个数据库将大的Spirte表面分割成一个矩形数组来调用,这请留意一下你硬盘中的商业游戏,你将会发现这些精灵对象的图形“模板”文件。
DirectDraw Blt()函数除了支持关键色处理外,也提供了例如镜象法、拉伸、及位图缩放等一些更高级的功能支持。这些特征,不管你使用何种方法,通常(是与设备相关的)由依赖设备的不同而得到不同的显示硬件的支持,如果使用,提供结果也是不一致的。Listing_1中提供了利用DirectDraw绘制画面的代码片段。
1.2、在DirectX 8.0中的改变
在DirectX 8发行时,Microsoft对图形引擎的设计及执行做了一些重大改变。它们用“DirectX Graphics”取代了DirectX 7中原来分开的DirectDraw及Direct3D部分。然而不久,你就会发现这个新的组件主要是对3D功能的支持的,而且通常也被称为“Direct3D 8”。DirectX图形接口并不是从先前的DirectX 版本的接口派生出来,而是一个全新的设计。当然也继承了DirectX版本的一贯风格 ― 兼容先前的接口,也就是说,你仍然可以在装了DirectX 8的机器上用DirectX 7的接口来编写程序。事实上,这也是DirectDraw程序员在看DirectX 8时经常看到的解决版本冲突的方法。这里引用2001年2月1日Microsoft的DirectX 常见问题解答:
“DirectDraw的大多数功能现已被含入新的Direct3D 8接口。编制单纯2D应用程序的开发人员可能会希望继续使用旧的DirectX 7接口。对于编制带有某些2D元素的3D应用程序的开发人员,鼓励其使用Direct3D替代程序(例如点对象和公告板纹理),因为这会改善性能和灵活性。”
当然这只是官方的陈词,当2D程序员用这些最新API写进他们的程序时会出现一些混乱。第一,“DirectDraw的大部分函数”已经包括到了新的Direct3D 8中(当然他们用了归入一词)会引起误导,最引人注目的就是不再有blit 命令或与之相等的功能,早在DirectX 8 beta的测试中,开发者希望一些新函数能提供一些blit的特性,例如:Copyrect()函数等,但这些函数都缺少对一些重要特性的 ― 关键色的支持。而在DirectX 8.0中的一些新特性,如:点对象(Point Sprites)等,却又只提供了有限的技术上和功能上的支持。而且对一些概念如“公告板纹理(billboard texture)”,只提供了一些信息,却没提供让程序员学习技术的例子。
第二,文中的最后一句“因为这会改善性能和灵活性”,很明显DirectX 8是要获得显卡的最大支持和硬件的最大加速性能而设计的,如缩放,旋转和3D图形中标准的Alpha混合技术都是硬件的支持。如Alpha混合是定义在DirectDraw的Blt函数中的,但是“在DirectX7.0中却是不支持的”,这使程序员很难运用这些特性。那么我们在2D编程中怎么利用DirectX8.0这些新特性呢?
---- ∵我是人类(♂)㊣,天蝎座
∴我冷静、深沉
My OICQ is 726556 |
|