DirectX Forum FAQ #2 [翻]

GameDev.Net DirectX Forum FAQ #2

 

[引言]本文翻译自GameDev.Net论坛上一名名为jhoxley的水友所编写的关于在GameDev.Net的DirectX区里广大水友经常问到的问题。鉴于DX更新速度很快,而此文成书时间比较早了,可能文中有一些地方已经不太适用新的SDK了。但是对于了解DirectX编程的新手(例如我)来说,很多概念上的东西还是阐述的很清楚的,是值得一看的东西。因此在这里将其中的主要部分(主要是D3D)翻译出来,方便查阅。如果您感兴趣,想转载的话,请注明出处,谢谢。

 

http://members.gamedev.net/jhoxley/directx/DirectXForumFAQ.htm#D3D_2

 

 

我应该从何处入手开始学习D3D呢?
由于每个人的起点高度不一样,所以大家的学习方法必定不会一样 - 希望本篇FAQ能够帮助 大家起个好头,能够在下面的内容中找到最适]]>
合自己的学习资料。
虽然Direct3D有很多技术范畴,但是基本上这些技术可以被划分为理论和实践两个方面。在计算机图形学中,数学知识(线性代数)作为一
个重要的基本组成部分被广泛地用于图形处理和操作,因此对向量/矩阵/平面/坐标系这些概念的理解是很重要的。虽然D3DX API简化了
这些底层数学知识的细节,但是通过使用D3DX API还是可以帮助我们了解当前场景正在发生什么状况以及为什么此时要使用这些数学方法
如果你觉得自己的数学功底并不是那么好,或者已经记不清最后一次上数学课是什么时候了,那么就请重新把数学课本捡起来吧,你绝对
是需要花费这个时间重新学习数学的。Eric Lengyel写的<Mathematics for 3D Game Programming and Computer Graphics, 2nd 
Edition>是一个不错的选择,这本书覆盖了很多计算机图形学数学知识的重点并且写得通俗易懂。
首先,必须认识到Direct3D是一套很难掌握的复杂的API;要花费大量的时间和精力才能将其掌握到一定的水准,从而写出高质量和稳定
的图形应用程序。每每当我们被旧有和现时的商业性游戏所吸引的时候,都觉得似乎可以很简单地就开发出这样的游戏 - 悲剧的是事实
并不是那样简单!牢牢记住一点 - 不要还没有学会走就想跑,要循序渐进,这样才能给自己一个良好的定位。必须意识到你要一步一步
构建自己的知识/能力/经验体系,这都是要花费大量时间的。
就像《如何入门》(未翻译)这章所说的那样,首先你要下载并配置好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已经涉及了许多可用的资源了;但是接下来讲到的是对学习API仍然是很有帮助的。
首先,Direct3D并不仅仅是一个3D API(尽管从名字上看好似如此) -- 你也可以使用它来做2D渲染(参看D3D#3 我只想做2D图形...)。许
多人发现使用这些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 固定管线?可编程管线?

 

  使用Direct3D生成图形的基本方法有两种 -- 传统的"固定管线"(Fixed Function)或者更加灵活的"可编程管线"(Programmable Piplline)。固定管线被认为是一种过时的方法,在对老版本的Direct3D 8的支持上更有效一些。然而在Direct3D 10中,固定管线将不再可用了。

 

  固定管线最显著的特点是矩阵变换和光照。比如说,SetTransform()、SetLight()、LightEnable()SetTextureStageState()函数就只会出现在固定管线中。此外,固定管线会使用FVF("Fiexible Vertex Format")来描述顶点信息。

 

  可编程管线使用了顶点(vertex)、几何(geometry)(Direct3D 10中新增)和象素(pixel)着色器(译者注:由于DX的发展,到DX11发布的时候,又增加了其他的着色器)。这些简洁的小程序可以运行自定义的函数,对输入的数据做处理,从本质上说这意味着编程更加的灵活,同时相比于固定管线,它们能够展示更加复杂的图形效果。可编程管线一般使用SetPixelShader()、SetVertextShader()SetVertexDeclaration()这类函数。

 

  尽管这两种方法各自有一些独特的特点,但是在性能上它们几乎没有什么差别。从开发软件的角度来看,当然不希望因为使用了不同的编程方法而造成性能上的损失。尽管硬件和驱动的实现细节对于大众来说是保密的,但是大家普遍达成共识认为显卡驱动会将API指令转换成GPU特定的"微代码"(micro-code) -- 就是说显卡会完成所有的实际工作而不管到底代码到底是基于固定管线还是可编程管线的。

 

  Direct3D 10已经放弃了固定管线,这也意味着不管是为了兼容现有的程序,还是将来开发,微软都想让开发人员把注意力集中在基于Shader的模式上。考虑到Shader本身的复杂性和目前大量的代码都使用的是基于固定管线模式,要实现上述目标很有点难度的,但是起码我们还有一种有效的方法可以尝试一下。Direct3D 9的[Effects Framework]允许将固定管线和基于Shader技术的代码统一起来,这样宿主程序就无需太多地关注到底我们使用的是哪一种技术了。效果框架这个抽象概念使得我们可以先使用固定管线来实现软件功能,等到将来有需要的时候再用相对应的shaders来替换它们。

 

系列上一篇 D3D#1 我应该从何处入手开始学习D3D呢?

posted @ 2010-05-21 13:59  芈希有  阅读(372)  评论(0编辑  收藏  举报