GameDev.Net DirectX Forum FAQ #1
[引言]本文翻译自GameDev.Net论坛上一名名为jhoxley的水友所编写的关于在GameDev.Net的DirectX区里广大水友经常问到的问题。鉴于DX更新速度很快,而此文成书时间比较早了,可能文中有一些地方已经不太适用新的SDK了。但是对于了解DirectX编程的新手(例如我)来说,很多概念上的东西还是阐述的很清楚的,是值得一看的东西。因此在这里将其中的主要部分(主要是D3D)翻译出来,方便查阅。如果您感兴趣,想转载的话,请注明出处,谢谢。
http://members.gamedev.net/jhoxley/directx/DirectXForumFAQ.htm#D3D_1
D3D#1 我应该从何处入手开始学习D3D呢?
由于每个人的起点高度不一样,所以大家的学习方法必定不会一样 -- 希望本篇FAQ能够帮助大家起个好头,能够在下面的内容中找到最适合自己的学习资料。
虽然Direct3D有很多技术范畴,但是基本上这些技术可以被划分为理论和实践两个方面。在计算机图形学中,数学知识(线性代数)作为一个重要的基本组成部分被广泛地用于图形处理和操作,因此对向量、矩阵、平面、坐标系这些概念的理解是很重要的。虽然D3DX API简化了这些底层数学知识的细节,但是通过使用D3DX API还是可以帮助我们了解当前场景正在发生什么状况以及为什么要在此处使用这些数学方法。
如果你觉得自己的数学功底并不是那么好,或者已经记不清最后一次上数学课是什么时候了,那么就请重新把数学课本捡起来吧,你绝对是需要花费这个时间重新学习数学知识的。Eric Lengyel写的《Mathematics for 3D Game Programming and Computer Graphics, 2nd Edition》是一个不错的选择,这本书覆盖了很多计算机图形学数学知识的重点并且写得通俗易懂。
首先,必须认识到Direct3D是一套很难掌握的复杂的API;要花费大量的时间和精力才能将其掌握到一定的水准,从而写出高质量和稳定的图形应用程序。每每当我们被旧有和现时的商业游戏所吸引的时候,都觉得似乎可以很简单地就开发出这样的游戏 -- 悲剧的是事实并不是那样简单!牢牢记住一点 -- 不要还没有学会走就想跑,要循序渐进,这样才能给自己一个良好的定位。必须意识到的是你要一步一步构建自己的知识/能力/经验体系,然而这都是要花费大量时间的。
就像《Get Started》(未翻译)这章所说的那样,首先你要下载并配置好DirectX SDK和你的开发环境以及编译器。本篇FAQ假设你已经做好了这些准备工作。
先来熟悉一下DirectX SDK的内容吧:
1.帮助文档
你应该可以在系统的SDK开始菜单组中找到这些帮助文档,如果没有的话,就直接转到%DXSDK_DIR%\Documentation\下,在这里你同样可以找到这些帮助文档。帮忙文档被分为两种类型:"托管DirectX"(directx9_m.chm)和"native DirectX"(directx9_c.chm),后者更好一些 -- 即使你是使用.Net API来开发程序,也会经常去参看C/C++文档的。当然本质上说API都是一样的,只是你使用的方法不同而已,文档不过起一个查询的作用罢了。这些帮助文件可以划分为两个部分:编程指南和参考。刚开始的时候,你可能更多地使用“编程指南”,但当你的经验多了以后,使用可以直接跳至主题的"参考"就更普遍了。
2.示例浏览器
在SDK的开始菜单中可以找到,如果没有的话,则直接打开%DXSDK_DIR%\Samples\SampleBrowser\SampleBrowser.exe。使用这个工具主要是用来查看随SDK发布的示例代码和文章的。示例浏览器很容易使用,你很有必要花费一些时间运行这些不同的示例来看看到底Direct3D可以做什么事情。点击浏览器中示例的"Install Project"链接,将会安装一份这些示例的拷贝,这样你就可以随意去修改这些拷贝而不会破坏原始的那份代码。DirectX SDK中的"Install Project"就等同于Visual Studio中内建的那些过时的"App Wizard"模板。
3.教程
DirectX SDK包含了一系列教程用于.Net(%DXSDK_DIR%\Samples\Managed\Direct3D\Tutorials)和C/C++(%DXSDK_DIR%\Samples\C++\Direct3D\Tutorials)开发。
4.示例
随SDK发布的源码主要是以示例的方式出现的。为了更好的理解API的方方面面,除了之前提到的那些教程之外,这些示例更能给你本质上的帮助。需要注意的是这些示例是独立于设备的(IHV-neutral);虽然它们可以尽可能利用硬件特性,但是却没有针对某个硬件做特别的优化。这之间还是有一点小小的区别的,如果你去看ATI的Radeon SDK和Nvidia的SDK,就发现它们在使用高级API特性的时候都或多或少采用了一些不同的很有用的优化手段。你可以通过示例浏览器或者到%DXSDK_DIR%\Samples\目录下运行这些示例。
SDK中所有内容是免费的,在你能够独立开发应用程序之前,应该花费一些时间去学习SDK中自带的资源。
一旦你使用过SDK,那么也考虑去网上搜索相关的内容吧 -- 许多网站都提供了免费的Direct3D编程的教程、示例和有用的信息。这些资料的质量参差不齐,但鉴于它们都是免费的,所以还是不妨一读的。你可以在"教程和文章"(未翻译)列表里找到更多推荐的网站。
当然,书本是学习一种新的API的不二法门 -- 一般来说你当地的书店里面的技术书籍都不会有太多的缺陷。GameDev.Net提供了一份推荐的DirectX书籍列表。但是有一点需要铭记于心的是,DirectX SDK的更新是很快的 -- 基本上每两个月就会更新一份新的SDK,如果你直接将书本中的东西(或者使用书本附带的CD中代码进行编译)拿来在新的SDK下使用的话可能会产生问题。
强烈推荐Frank Luna写的《Introduction to 3D Game Programming with DirectX 9》 (新版本更名为《Introduction to 3D Game Programming with DirectX 9.0c: A Shader Approach》),在此书的网站上你也可以找到很多有意思的东西。
到目前为止,本篇FAQ已经涉及了许多可用的资源了;但是接下来讲到的几点是对学习DirectX API仍然是很有帮助的。
首先,Direct3D并不仅仅是一个3D API(尽管从名字上看好似如此) -- 你也可以使用它来做2D渲染(参看D3D#3)。许多人发现使用这些API将很容易完成2D图形的工作 -- 在不进入3D世界的情况下,你仍然可以使用大量重要的3D API来完成你的工作。
第二点,Direct3D开发有两种各具特色的编程模式 -- "固定管线"和"可编程管线"。前者传统一些 -- 通过调用不同的状态设置方法,你可以通知API完成你想要的结果;而后者则可以给你更多的自由来让你编写出由GPU运行的更短小的程序(shader)。固定管线很简单但是却过时了 -- 基本上只用于过时的硬件(特别是D3D8) -- 对于未来的发展来说,固定管线并不是一个好的选择。如果你现在刚开始学习DirectX的话,那么最好避免再学习这过时的玩意儿了,而应该学习可编程管线 -- 虽然刚开始学习可能会更困难一些(在D3D10之前的版本都是两种方法混合使用的),但是从长远来看更利于你后续的学习。这不仅仅因为Direct3D 10已经放弃了过时的固定管线,更多的是由于shaders本身的功能更强大,它们几乎占据了现代各类文档/研究报告/文章/示例代码,随着时间的推移,会越来越难找到过时技术的相关资料了。
从长远的眼光看,为了学习D3D API,将编程的注意力集中在通过HLSL(High Level Shader Language)编写的shader上是很重要的,这些shader是构建在effects framework(这个效果框架是很方便的,但是并不是必需的)下的。对于固定管线和可编程管线更多的讨论,将在接下来的FAQ中被提及。
最后一点,在论坛里有一篇名为"Your moderator needs your help: How did *you* start learning Direct3D?"的帖子,用于讨论本篇FAQ其他的后续问题。你可以在这篇帖子里找到其它水友的关于"何处入手开始学习D3D"这个问题的答案。
系列下一篇 D3D#2 固定管线?可编程管线?