CR的代码文本

all for learning about the world
  订阅 订阅  :: 管理

纯转D3D问题

Posted on 2010-07-09 14:52  mumuliang  阅读(315)  评论(0编辑  收藏  举报

原帖地址:http://bbs.bccn.net/thread-224560-1-1.html

指出Direct3D9存在的一些问题:(以下DirectX等都是指最常见的第DX9版本)

1.无法移植,只能在微软的操作系统上运行。要知道,在国外使用Linux系统的人是很多的,如果你用D3D做游戏,那他们将无法运行。
大家不妨试着在baidu,google,yahoo等搜索引擎下搜索“Direct3D”和“D3D”,你将会发现比较有价值的信息很少。

2.版本众多。现在的DirectX组建是10版本的,可想而知其有多少个版本?光D3D常用的就有7,8,9三个版本。不同的版本之间的有些函数是不一样的,这导致了从旧版本更新到新版本的一系列问题。而且版本多也对网络资源共享不利。

3.使用烦琐。DX的所有成员都是以COM的形式存在的,这说明了其所有关键操作都是通过指针及成员函数来调用的。就不说其他的,满满一屏幕的指针就看得我眼花缭乱,谈何游戏开发??有时间的朋友不妨试试,Direct3D的初始化工作就够你受的了。

4.设备容易丢失。自从我学DirectX以来,我就发现不论是D3D也好,DDraw、DInput也罢,只要你对系统有一些剧烈的操作之后,它的设备就丢失了。所以我总觉得DX是一个“漏口袋”,稍微抖抖就漏了,漏了就又要重新初始化设备、重新读取资源。

5.画质不佳。我曾经拿D3D和OpenGL绘的图象做了个对比,就是用同样的参数绘制同样的图象。我发现D3D的颜色明显不精确。这对于做游戏来说或许影响不大,但是做专业绘图工程就不行了。难怪D3D始终无法战胜OpenGL,我想这或许就是原因之一吧。

5.功能鸡肋。Direct3D的功能比OpenGL的多,这个我承认。但我发现D3D的这些OpenGL所没有的功能都是一些“几百年难得一用”的功能,而且当前多数显卡都不支持这些功能,就算是那些D3D的游戏开发这也很少用。
至于那些ID3DX***组建,我只想说,功能多,但不好用。要知道OpenGL提供了许多底层的操作函数,而D3D则没有。

7.HWND和HDC的问题。Direct3D的初始化是一定要一个窗口的句柄(HWND)的,而OpenGL的初始化只需要一个设备描述符(HDC)就可以了。了解界面编程和图象编程的朋友应该都清楚这意味着什么吧——你可以通过一个HWND获得其HDC,而不能用一个HDC来得到其HWND。这说明OpenGL可以很方便地在任何有HDC的东西上绘图(我见过许多人用MFC单文档来做OpenGL),而用Direct3D做这个将变得复杂(我是测试了好久才知道怎样用MFC做D3D的……在网络上根本没有关于这方面的资料……)。

8.坐标问题。D3D支持空间左手坐标系和右手坐标系,而OpenGL只有右手坐标系。这看起来不是D3D比OGL更好嘛?其实不然,多了一种坐标系的选择,等于给新手多设了一个门槛,很多人就是因为这个而分不请东南西北上下左右的,曾经听说过某游戏公司里的程序员们由于没有商量清楚,一些是用左手坐标系,一些是用右手坐标系,搞得最后手指比得都抽筋了(数学上习惯用左手和右手来比坐标系的xyz的方向)还没有分清到底哪个坐标系,大家都稀里糊涂地。上面这些不是暂且忍了,但是……以下这些问题是让我决定放弃D3D的最主要原因: 9.取图不精。在3D绘图里,都要把一张图片上的某部分贴到一个片面上。但是问题来了,在D3D里的图片(纹理)坐标是用float来计的,浮点都是有精度的,当精度不够用时就会出现误差。所以在贴图过程中产生了误差而使得最终显示的图片产生偏移(虽然u、v坐标只偏移了1个像素)。这是很严重的问题,或许在绘制3D模型时这点小误差不影响大局,但是我现在是用D3D来绘制2D图象啊,哪怕是一点点误差都不能容忍的! 10.半透明问题。在Direct3D中规定,绘制一系列透明和半透明物体时,要先画不透明的,再画透明的(OpenGL中有这个规定吗?),好,那么如果所有的物体都是透明的那该怎么办呢?先画什么呢?D3D又有个规定:先画离摄象机近的,再画离摄象机远的(OpenGL中有这个规定吗?)。原来D3D有这个规定啊,难怪玩了许多游戏都发现有些地方的半透明处理得乱七八糟的,印象最深的是玩仙剑4时,在一个有黄色半透明光带的地图(这个光带环绕了整个地图,记不得那地图叫什么名字了),如果你有心的话,不难发现,透过某个光带看另一个光带,你将看到那个越远的反而在近的那个光带的上面,即越远的看起来反而更近,近的反而跑到更远去了!很严重的问题!!