初学者应该选择DirectX 9还是DirectX 10?

10

我希望通过做项目来让我的简历更加吸引游戏公司。因此,我打算开始购买相关书籍。但我不知道应该先阅读DirectX 9还是10的API书籍。尽管DirectX10很好,但似乎行业转型到10上的速度比较缓慢。所以我应该使用9还是选择10呢?


如果要开发面向最大可能受众的应用,选择DX9。否则,选择DX11。 - derpface
@uberwulu 不再是这样了。Win 7在2011年末破坏了50% / 2012年初 - bobobobo
@bobobobo:所以如果DX11被超过50%的设备支持,而DX9仍然被100%的设备支持,那么DX9仍然会比DX11拥有更广泛的受众,这个结论仍然成立。 - derpface
你想专注于一个领域。你不能关注所有的事情,比如物理、游戏机制和声音。所以如果你选择了图形路线,你应该专注于从编辑器中简单地导入向量、导入地图和创建道具管理器。就是这样!其他任何东西,你都将学习一堆无用的东西。如果你想做物理学,那么使用像Ogre 3D这样的现成图形库。我相信Ogre 3D是开源的,所以解剖已经构建好的东西总是很好的,你可以更快地学习。 - numerical25
9个回答

14

我建议先学习DirectX9的基础知识,然后迅速转向DX11。与DirectX9相比,DirectX11更难入门,因为它略微更加复杂,同时D3DX中的许多实用函数已经不存在,或者已经被移动到源代码(例如效果框架)中。这并不是坏事,但它使得学习变得更加复杂,因为你必须一次性学习更多东西。

花2到3周的时间学习DX9,然后转向DX11进行“真正”的工作:P

使用固定管线和d3dx学习基本的DX9知识等,加载模型等。相比DX11,它要简单得多,并且文档也更好,你将可以更快地在屏幕上获得一个三角形和一个模型。直到你完全理解基本的概念和变换。

但接下来用着色器重写所有内容。无论如何,你都需要在DX10/11中使用它们,但是当你已经有一个可工作的代码框架时,学习会更容易,并且在DX9中让它工作也更加简单。

学习完基本的3D和编程着色器知识之后,就可以开始学习DX11。你将不得不切换数学库。你将不得不发明自己的模型格式和加载程序。你将不得不发明自己的效果框架或使用示例框架,但是现在它们都更容易了,因为你已经掌握了基础知识。


DX9看起来“简单”的主要原因是你可以利用传统的固定功能管线进行基本渲染,而不必立即学习HLSL,但随后你必须立即放弃这种方式去学习“现代”GPU编程。最好使用DX11和DirectX工具包,其中包括大量的入门代码,包括“股票”着色器。 - Chuck Walbourn

3

针对OneOfOne的评论,如果您知道如何在GL、D3D9、D3D10或D3D11中进行3D开发,则可以通过一点点努力将这些技能转移到其他任何技术上。

个人建议学习D3D11,因为这是最前沿的技术。您会发现只需要稍微努力就能够掌握GL、D3D9或D3D10。如果足够努力地学习理论知识,您甚至会发现将这些技能转移到完全软件引擎上也并不难。


1
在简历中匹配正确的DirectX版本,只对初级代码猴子至关重要。 - Tadeusz A. Kadłubowski
说实话,我开始从事PS2开发是因为我写的DX7/8引擎很好。我的TD印象深刻,在接下来的几年里,我和一位同事共同编写了可能是最先进的PS2引擎之一。可惜它被利用得如此之差 :( - Goz
听起来不错。但是D3D11绝对没有任何出版商的资源。我理解DX的道路会更加困难。 - numerical25
我通过示例自学了DX5。不可否认的是,在那时我已经编写了一个基本的软件引擎... - Goz
3
即使没有出版商推出D3D11游戏,也不意味着在你可以正确地说出自己对该API有所了解的6个月后仍然如此。如果你学习D3D9,你可能正在学习一个即将消亡的系统。据我所知,所有正在使用D3D10的人现在都在使用D3D11。你可以在D3D10硬件上运行D3D11,因此,虽然你无法获得所有的花哨效果,但你仍然在使用现代系统之间的通用API。另外值得一提的是,我刚刚升级了我妻子的笔记本电脑,在她8年前的笔记本电脑坏掉后,我们花了400英镑买了一台DX10笔记本电脑。 - Goz
2
此外,D3D10 几乎是 D3D11 的严格子集,因此如果您了解 11,那么您也了解 10。 - Axel Gneiting

2
如果你真的想学习一项在游戏行业中会用到的技能,那么请坚持使用DirectX 9。由于DirectX 10和11都需要Vista或Windows 7,因此游戏开发者仍然大多忽略它们并针对DirectX 9进行开发以获得对Windows XP的支持。
话虽如此,从哪个版本开始学习并不是很重要。它们之间的差异并不大。如果你理解3D API背后的概念以及GPU管道的工作原理,那么你可以轻松地掌握其中任何一个,甚至包括OpenGL。

1
我倾向于不同意。如果你掌握了D3D11,那么你可以轻松处理D3D9。从一个即将过时的API开始并不是一个好主意,而且它还有太多的遗留问题(固定功能),应该忽略掉。这对初学者来说只会造成困惑。 - Axel Gneiting
1
DX9 API中唯一“过时”的部分是初学者永远不会涉及的高级主题。我同意浪费时间学习纹理采样器状态、固定功能凸起映射或立方体映射的复杂性是一个坏主意,但90%的DX9直接映射到DX11。API已经进行了一些清理,但事情基本上还是以相同的方式工作。对于初学者来说,在3D、几何变换、z缓冲、alpha混合等方面学习的主要步骤几乎与API无关。在DX9中,只需坚持使用基于着色器的渲染来处理更高级的内容。 - Alan
4
我使用D3D自版本7以来,D3D10和11比旧版本更能让你清楚地了解GPU上正在发生的情况。学习曲线可能更陡峭,但一旦掌握了概念,你应该清楚究竟发生了什么。另一方面,D3D9只有固定功能和其他很多遗留问题,在我看来只会分散注意力。最好从一开始就以“正确的方式”学习它。 - Axel Gneiting
@Axel 实际上,他们“要求”你理解GPU中正在发生的事情!(http://msdn.microsoft.com/en-us/library/bb205123(VS.85).aspx) - bobobobo

1

事实是,你需要学习两者。

只要仍有50%的玩家使用WinXP, 你就需要能够编写Direct3D9程序。

D3D9 并不比D3D10/11更容易入门。它们有相同的原理,需要放置顶点、计算法线和渲染网格。无论你是创建ID3D11BlendState结构还是调用IDirect3DDevice9::SetRenderState(),都是相同的概念,只是不同的实现方式。

在使用d3d11几天后,我认为它在很多方面比DX9更好。首先,您可以使用GPU的全部容量,包括几何着色器。其次,它强制您完全了解图形管道,以便绘制任何内容(请注意,函数命名方式是根据它们影响的管道阶段命名的:here: (IA* fcns: 输入装配阶段,OM* fcns: 输出合并阶段等))。这可能会导致稍微大一点的初始启动曲线,但一旦掌握,它不比D3D9难,并且更好,因为函数的命名有助于概念的理解。
所以开始学习两者,并且同时学习可能有助于减少学习过时API/ DX9方法所需的努力量(即您真正想要花更多时间使用着色器,并且不要太多使用DX9的固定功能管道部分)。

下投票者,请解释你的理由,否则你的投票将被移除!! - bobobobo
一般来说,您只有在针对Windows XP时才会使用DX9,这种情况下,您还需要使用传统的开发人员工具、传统的SDK、传统的支持库和中间件,并且要瞄准极其老旧/低级别的机器,因为它们主要存在于中国、韩国和俄罗斯。如果您正在做其他任何事情,请避免很多不必要的痛苦,专注于DirectX 11。如果您的目标是Steam的受众群体,那么选择DirectX 11是毫无疑问的,因为Windows XP的用户不到5%。 - Chuck Walbourn

0

除了一些小例外,DX10基本上就是一个没有遗留问题的DX9。例如,DX9具有内置选项,用于渲染Flatshaded、Textured或使用Shader。在DX10中,这些选项已经消失了,您必须始终使用真正的着色器。如果您想进行平面着色,请编写一个执行平面着色的HLSL着色器。

因此,我建议您学习DX10(或DX11)。您将能够快速适应DX9,但通过不使用遗留函数采用更现代的编码风格。它们可能会让人感到困惑,因此DX10将使您专注于相关事项。

如果您是真正的初学者,并且设置顶点缓冲区以创建单个三角形令您感到困惑(作为真正的3D程序员,您对单个三角形不再感兴趣),我甚至建议您从OpenGL开始。您将获得更快的成功,但实际上,如果您想专注于现代3D编程,则这可能会有点分散注意力,就像DX9遗留问题一样。


0

没错,不要浪费时间在DX10上,它从来没有成为行业标准,也没有足够大的变化来促使人们从DX9升级,但对于DX11来说是有的。


0
你可以查看Luna的书籍以了解DX9/DX11(我建议你从11开始)。你可以参考http://www.rastertek.com/tutdx11.html,但他没有解释所有内容,所以你可以去看一下Luna的书籍来了解这些函数或属性的具体情况。

0

我建议使用DirectX 11,因为在我看来,浪费时间在已弃用的函数或技术上是没有意义的。 从头开始学习着色器将使事情更加清晰。


-1

尝试运行9和10版本的示例文件夹中的样本,如果你的电脑支持的话,再试试11版本。这就是我正在做的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接