【转载】接触了这么久的Direct3D和OpenGL,发现还是Direct3D好啊...
2008-12-16 15:19
316 查看
在D3D没有出现我满意的版本之前我将一直学习和使用OpenGL。
哎...D3D实在太令我失望了...
我将列出D3D与OGL的对比,并且发一个OpenGl的教程给大家。
OpenGL主站:www.opengl.org
函数说明:http://www.opengl.org/sdk/docs/man/
先发一个:
指出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时,在一个有黄色半透明光带的地图(这个光带环绕了整个地图,记不得那地图叫什么名字了),如果你有心的话,不难发现,透过某个光带看另一个光带,你将看到那个越远的反而在近的那个光带的上面,即越远的看起来反而更近,近的反而跑到更远去了!很严重的问题!!
这些问题看起来是小问题,但小问题往往决定了你的游戏的质量。在微软没有解决这一系列问题之前,不用Direct3D。以前一直不解为什么那些高手们总是用OpenGL,现在是了解了……还算不晚吧
文章出处:http://bbs.bccn.net/thread-224560-1-1.html
哎...D3D实在太令我失望了...
我将列出D3D与OGL的对比,并且发一个OpenGl的教程给大家。
OpenGL主站:www.opengl.org
函数说明:http://www.opengl.org/sdk/docs/man/
先发一个:
指出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时,在一个有黄色半透明光带的地图(这个光带环绕了整个地图,记不得那地图叫什么名字了),如果你有心的话,不难发现,透过某个光带看另一个光带,你将看到那个越远的反而在近的那个光带的上面,即越远的看起来反而更近,近的反而跑到更远去了!很严重的问题!!
这些问题看起来是小问题,但小问题往往决定了你的游戏的质量。在微软没有解决这一系列问题之前,不用Direct3D。以前一直不解为什么那些高手们总是用OpenGL,现在是了解了……还算不晚吧
文章出处:http://bbs.bccn.net/thread-224560-1-1.html
相关文章推荐
- [OpenGL(C)] - 接触了这么久的Direct3D和OpenGL,发现还是Direct3D“好”啊...
- 多年以后发现csdn还是这么耐用
- Direct3D好,还是OpenGL好呢?
- 学习游戏开发,先学OpenGL再学Direct3D还是直接学习Direct3D?
- Direct3d & opengl & 3d max的配置和使用
- 关于指针常量和常量指针(本来想自己写的,发现自己有混淆了,因此转载了一篇)
- 本来是累得不行想关机了,这么累的一天还是记下来吧
- ttserver发现的问题,可能是故意这么弄的,如果不是故意的,那就需要我们注意了
- 转载——配置OpenGL
- [转载]MFC中OpenGL旋转的问题
- 问题:rm一个文件后,发现文件还是存在的
- Java 理论与实践: 变还是不变?[转载]
- Direct3D和openGL故事【转】
- 发现了一本媲美鸟哥的linux私房菜的linux操作系统书--linux就该这么学
- 【转载】OpenGL开发库的组成
- 【转载】一手遮天还是共生共荣?——Facebook的开放世界
- 即使这么忙,还是要记录下这个AndroidStudio的坑:Binary XML file line #20: You must supply a layout_width attribute.
- Android,开源还是封闭?转载自阮一峰
- 本来认为 CTreeCtrl类 在ASCII环境下与在UNICODE环境下略有不同 但现在发现我错了,两者还是相同的
- EXTJS学习系列基础篇:第四篇(转载)作者殷良胜,Ext中有两个很重要的方法,一个是decode;一个是encode.顾名思义,一个是编码,一个是解码,你难道真的这么想吗?严格的说,一个是将json字符串转换成对象;一个是将对象转换成json字符串