转自:http://fotoone.spaces.live.com/blog/cns!68DE430B0B5562FB!901.entry
和WQ谈起有关游戏开发和Direct3D编程的事,因为他是入门者,所以,我给他提了点入门级的学习建议。
1. 浏览一下DirectX SDK中Direct3D 10教程
DirectX SDK肯定是要好好研究和学习的。目前DirectX的最新版本是v10,v11不久将大驾光临。SDK的最新版本是March 2009 DirectX SDK。在DirectX SDK中,主要学习Direct3D 10的内容。SDK中有一个Direct3D系列教程,可以把这个系列教程的文档看看,编译和运行教程中的所有程序,得到一点3D编程的感觉,这个时候不需要对其中涉及的概念原理有很深的了解。
2. 了解下游戏引擎
但是,在深入学习Direct3D之前,建议看看Jake Simpson的Game Engine Anatomy 101系列文章,是用来讲解游戏引擎的,中文翻译是游戏引擎剖析。在看完后,会对游戏引擎有较全面的了解,大致会知道在一个游戏引擎中,图形渲染起什么作用,Direct3D在游戏引擎中是干嘛的,处在一个什么位置。
3. 了解Direct3D graphics pipeline一般原理和组成(固定功能流水线和可编程流水线)
学习Direct3D,就是要掌握Direct3D graphics pipeline。在了解了游戏引擎之后,阅读一下ExtremeTech 3D Pipeline Tutorial 或者Real-Time rendering第三版的第二章(The Graphics Rendering Pipeline),它们都是讲述实时Direct3D graphics pipeline的一般原理的。我个人感觉前一篇文章内容要多点,也稍微难懂点。 当然,最好2篇文章都看看,可以相互参照进行阅读。
BTW,Real-Time rendering是一本很好的图形学的书,要成为图形学专业人士的话,可以认真研究,现在最新版是第三版,唉,想起我以前的买的三本图形学教材都过时了,计算机图形学可真是发展太快了!
4. 学习Direct3D graphics pipeline
这几篇文章看过后,再花功夫好好研究DirectX SDK中的DirectX Documentation for C++,特别要明白Direct3D graphics pipeline的各个阶段。这个阶段也可以找本DirectX入门书看看,网上有人推荐Introduction To Direct3D9,有中文版,我没看过,但这本书是讲Direct3D 9,而非Direct3D 10和Direct3D 11,由于架构上的变化(Direct3D 10抛弃了固定功能的vertex和pixel处理),和Shader Model变更(抛弃了老版本的Shader Model,只支持全新的Shader Model 4),以及Shader编程语言的变化(不再支持汇编,只支持HLSL),Direct3D 9和Direct3D 10有很大的区别,所以不推荐入门者浪费青春去学习Direct3D 9,而应该直接学习Direct3D 10和Direct3D 11。
在阅读DirectX Documentation for C++的时候,也阅读Real-Time rendering第三版的第三章(The Graphics Processing Unit),在这个学习阶段,我强烈推荐看Programming Vertex, Geometry, and Pixel Shaders。
另外,可以参考一下Richard Thomson的Direct3D Graphics Pipeline资料,主要看看其中的Direct3D Graphics Pipeline Poster,这张图类似Direct3D API迷宫的导航图,我个人感觉在学习和掌握Direct3D API方面,很有价值。 同样,要注意的是Richard Thomson的Direct3D Graphics Pipeline Poster针对的是Direct3D 9.0版本,此图不反映最新的Direct3D流水线,但此图依然对理解Direct3D 10/11 pipeline有参考价值,比如:Direct3D 9 Graphics Pipeline Poster图中的Vertex Assembly以上部分可以理解为Direct3D 10/11 pipeline中的Input-Assembler Stage(IAS),同样,Vertex Assembly到Primitive Assembly的之间的部分理解为Direct3D 10/11 pipeline中的Vertex Shader Stage(VSS),Primitive Assembly到Rasterization and Component Interpolation之间的部分理解为Rasterizer Stage(RS),Rasterization and Component Interpolation和Fog Blend之间的部分理解为Pixel Shader Stage(PSS),Fog Blend以下的部分则理解为Output-Merger Stage(OMS)。另外,Direct3D 9中的一些处理阶段,比如Alpha Test,在Direct3D 10没有单独实现,需要编写Pixel Shader实现,所以,Direct3D 10/11 pipeline中不会出现Alpha Test处理阶段。
BTW, 写到这,我突然想,我是不是该把Richard Thomson的Direct3D 9 Graphics Pipeline Poster的图改写一下,发布一张Direct3D 10/11 Graphics Pipeline Poster? 恩,不过,我想Richard Thomson自己会做这个工作的!
最新版本的March 2009 DirectX SDK主要包括的是Direct3D 10&9 Graphics Pipeline的内容,有关最新Direct3D 11 Graphics Pipeline的内容,可以看看Introduction to the Direct3D 11 Graphics Pipeline中的PPT,或者阅读一下March 2009 DirectX SDK中的Direct3D 11 Technical Preview,不过现在看不看都没有什么关系,毕竟Direct3D 11还不知道何时正式登场。
5. 根据自己的兴趣,挑选几个Direct3D Samples进行研究
理解了Direct3D图形流水线之后,可以根据兴趣学习图形学中的不同方面的知识,比如,对动画、阴影感兴趣,就可以重点研究Direct3D Samples中的动画、阴影的例子。研究代码的同时,也学习动画、阴影原理,这样学起来,得心应手。
6. 学习Direct3D的方法总结
在我看来,学习,应该首先建立系统框架图,就好比去游乐园玩,有导航图一样,学习的时候,才不会迷失在错综复杂的技术细节之中。然后,再像玩拼图游戏一样,把系统的各个知识面拼缀到这个系统框架图中,形成完整的知识系统图。
这种方法用在Direct3D的学习上,可以认为是:先理解游戏引擎这个系统框架图,然后,明了3D 图形子系统在游戏引擎中的位置。接着,在理解3D图形子系统(Direct3D)这个子系统框架图的基础上,明了Direct3D流水线,进一步针对Direct3D流水线包含的各个阶段(Stage),深入学习Direct3D API。在学习中,遇到函数、结构、常量可以自动地发现这些东西在Direct3D流水线中的哪个阶段被用到。按照这种方式进行学习,可以比较方便地把各个知识点有条理地拼缀起来,极大地提高学习效果。
-----
注:某日在网上看到一篇游戏程序员养成计划,写得细致全面,强烈推荐。地形渲染还有一本书《Focus On 3D Terrain 》,我建议学习地形渲染看这本书比较容易上手。本书网上有中文翻译(我建议别看,翻译得差)。所有书籍,都推荐直接看英文版的。
WinCapture: www.wincapture.com
WinCapture The most popular screen capture, video screen recording and image editing utility for Windows, with more than 9 million downloads.
Capture anything you see on your computer screen - images and text.
Easily record activity on your computer screen, audio and webcam video.
Edit your screen captures and images with drawing tools, annotations and stunning visual effects.