天天看點

DirectX 9.0c遊戲開發手記之RPG程式設計自學日志之5: Drawing with DirectX Graphics (用DirectX圖形繪圖)(第1節)

        本文由哈利_蜘蛛俠原創,轉載請注明出處!有問題請聯系[email protected]

        從這一期起,我們進入了本書的第二部分,叫做DirectX Basics (DirectX基礎)。這一部分分為以下五個章節:

第2章 Drawing with DirectX Graphics (用DirectX圖形進行繪圖)

第3章 Interacting with DirectInput (與DirectInput互動)

第4章 Playing Sound and Music with DirectX Audio and DirectShow (用DirectX Audio和DirectShow播放聲音和音樂)

第5章 Networking with DirectPlay (用DirectPlay進行聯網)

第6章 Creating the Game Core (建立遊戲核心)

        不過十分遺憾(或者是幸運?哈哈,至少我可以省點力氣了……)的是,第4章用到了現在已經過時的DirectShow(DirectX June 2010中沒有DirectShow元件了);而第5章用到了DirectPlay,一方面我們不需要給遊戲增加網絡連接配接功能(難道不是嗎?),另一方面這裡的DirectPlay技術也已經過時了,是以我們就省去這兩章内容了。

        當然,這也就意味着第6章的遊戲核心會缺少兩個看起來很重要的元件。這也沒辦法,暫時這樣吧!做一個啞巴遊戲也不錯!等到以後學到了給遊戲增加聲音的方法後我再擴充這個不完整的遊戲核心(Direct Audio部分,或者更準确地說是DirectSound和DirectMusic并沒有過時,但是這本書裡是和DirectShow組合起來講的,而“龍書”系列直接沒有講聲音部分;本人現在還在尋找這方面的比較新的書籍)。

        好的,今天我們來講第2章的第1節。我們把這一章的結構列在下面:

1、The Heart of 3-D Graphics (3D圖形的心髒)

2、GettingStarted with DirectX Graphics (準備使用DirectX圖形)

3、TheMath of 3-D (3-D的數學)

4、GettingDown to Drawing (開始繪制)

5、UsingTexture Maps (使用紋理映射)

6、AlphaBlending (阿爾法混合)

7、UsingFonts (使用字型)

8、Billboards(廣告牌)

9、Particles(粒子)

10、DepthSorting and Z-Buffering (深度排序和Z-緩存)

11、Workingwith Viewports (運用視口)

12、Workingwith Meshes (運用網格模型)

13、Mesheswith D3DX (D3DX與網格模型)

14、WrappingUp Graphics (總結圖形部分)

         好啦,現在正式開始啦!

        原文翻譯:

===============================================================================

        最近的遊戲用它們那驚人的畫面和酷炫的效果讓俺們眼花缭亂。正是那些圖形效果吸引住了廣大玩家的眼球,是以圖形是你的項目中的一個主要組成部分。幸運的是,大多數圖形引擎以及其背後的概念很直覺且易于了解。通過運用繪制圖形的基礎知識,你可以重新創造你在遊戲中見到的炫酷效果,并且還可以創造你自己的新效果。

        現在是時候來建立你自己的圖形引擎了,那麼你可以求助于DirectX Graphics,它是DirectX的圖形元件。在本章中,我會教給你如何使用DirectX Graphics,包括基本的是繪制技術以及例如紋理映射和Alpha混合等的DirectX Graphics的進階技術。在本章結束之時,你将會成為一個圖形程式設計專家!

        在這一章裡,你會學到以下知識:

1、DirectX圖形

2、如何在3-D中工作

3、矩陣數學

4、使用D3DX庫檔案

5、用頂點和多邊形來繪圖

6、使用紋理映射

7、使用alpha混合

8、廣告牌技術和粒子

9、運用網格模型

10、使用.X檔案

11、讓網格動起來

2.1 The Heart of 3-D Graphics (3-D圖形的心髒)

        雖然在本書這時候跳躍到像3-D這樣的高端主題上也許看上去不太合乎邏輯,但是實際上這是很符合邏輯的。具體地說,DirectX的整個圖形系統建立在微軟在3-D領域的侵略——這正是Direct3D——的基礎之上。出于這個原因,你用DirectX Graphics所做的所有事情都是使用3-D術語和用法來叙述的。

        注意:

===============================================================================

        在這一節裡,我想向您介紹3-D屬于以及用3-D圖形繪圖的理論。在本章稍後的“Getting Down to Drawing”這一節中,你通過開始使用DirectX Graphics來繪圖将   理論運用于實際。

===============================================================================

        用Direct3D所繪制的所有東西,我是說所有東西,都是由多邊形構成的。一個多邊形(polygon)通常是一個由三個點——稱為頂點(vertex,複數為vertices)——組成的三角形圖形。頂點是3-D中最小的機關;它是位于2-D或3-D空間的單個的點(坐标)。你将兩個頂點連接配接起來,就建立了一條邊(edge)(線,line);将三個頂點用三條邊連起來,就形成了一個多邊形。你可以将頂點、邊和多邊形的關系想象成一種連點遊戲(connect-the-dots game),裡面的點是頂點,而你畫的線就是邊。

        互相連接配接的邊形成了一個多邊形面(polygon face)(其實我覺得這裡說得有問題),而整個的圖形稱為一個網格(mesh)(網格是所有的基本的繪圖對象的頂端——頂點、邊和多邊形)或這模型(model)。你可以在圖2.1中看到頂點、邊、多邊形和網格的關系。

DirectX 9.0c遊戲開發手記之RPG程式設計自學日志之5: Drawing with DirectX Graphics (用DirectX圖形繪圖)(第1節)

        為了展示出有着更加逼真的外觀的3-D物體,Direct3D使用我們稱之為材質(materials)的東東、使用我們制定的顔色來填充一個網格的空心的多邊形。材質由一個顔色成分的組合來表示,并且還可以包含有被稱為紋理(texture)的bitmap格式圖檔(現在早就不限于bitmap格式了),該圖檔可以在多邊形被渲染的時候鋪在其表面上。

2.1.1 Coordinate Systems (坐标系統)

        當處理圖形的時候,你也許已經鼠戲了2-D的坐标了;它們具有用像素來計算的寬度和高度。寬度的水準跨度叫做x-坐标(x-coordinate),而垂直的跨度叫做y-坐标(y-coordinate)。每一個坐标都是從圖檔左上角的出發點(offset)處開始計量的。

        在圖2.2中,你可以看到坐标各在其位。x-坐标從左往右跑,其原點(x-坐标=0)在最左端。y-坐标從上往下跑,其原點(y-坐标=0)在最頂端。These coordinates extend in a positive direction to the other end oftheir respective spans.(這句話不知道怎麼翻譯。)在Direct3D中,2-D坐标一般被稱為變換後的坐标(transformed coordinates),因為它們代表用于繪制物體以供展示的最終坐标。

DirectX 9.0c遊戲開發手記之RPG程式設計自學日志之5: Drawing with DirectX Graphics (用DirectX圖形繪圖)(第1節)

        在3-D中,增加了一個額外的坐标——z-坐标。一般來說,z-坐标代表圖形的深度。更重要的是,y-坐标反過來了,是從下往上走的(正向朝下)。你可以在圖2.3中看到三個坐标的分布。你可以用兩種方式來使用z-坐标:讓正向從原點往前(遠離你)或往後(朝向你)。這兩種方式通常被分别稱為左手和右手坐标系。在此書中,我使用左手坐标系。

DirectX 9.0c遊戲開發手記之RPG程式設計自學日志之5: Drawing with DirectX Graphics (用DirectX圖形繪圖)(第1節)

        注意:

===============================================================================

        左手和右手坐标系的名字來源于這樣的事實:你可以通過你的手來确定這些坐标的方向。伸出你的左手讓手掌朝向上方。讓你的大拇指遠離你(你的其餘四指應指向右方)。你的大拇指指向的是z-坐标的正向,而你的其餘四指指向的是x-坐标的正向。現在,讓你的其餘四指向上(但是不要移動你的手),現在它們指向的是y-坐标的正向。這就是左手坐标系。用右手做同樣的事情,就可以得到右手坐标系的分布了。

===============================================================================

        3-D世界中的所有事物都是用這些坐标系進行描述的——對于圖檔和視訊顯示是用2-D坐标系,而對于其他的所有東西則用的是3-D。是以,如果你想要在空間中定義一個在你面前(沿着z-軸)、稍微偏向你的右邊(沿着x-軸)以及大緻和眼睛在同一高度(沿着y-軸)的點(使用3-D坐标),你可能會将其坐标設為X=100, Y=50, Z=200。這些坐标分别表示向右100機關、地面之上50機關以及在你面前200機關。

        對于2-D坐标,你會說牆上的一幅畫為200機關寬、200機關高。畫的中心的坐标為X-100,Y=100,而話的左上角的坐标也許是X=0, Y=0。這些3-D坐标被稱為未變換的坐标(untransformed coordinates),因為它們不代表用于繪制物體以供展示的最終坐标。另一方面,2-D坐标被稱為變換後的坐标,因為它們直接映射到顯示屏坐标上。在本章稍後的一節“3-D的數學”中,你會發現如何将未變換的坐标轉換成變換後的坐标,但是現在呢,我們集中來讨論如何使用你剛才讀到的坐标來定義物體。

2.1.2 Constructing Objects (建立物體)

        在建立如網格和模型(甚至是平直的2-D圖像)等物體時,你會從頂點級别開始。每一個頂點具有一個x-, y-, 和z-坐标的值。你可以用三種方式來設定這些坐标:螢幕空間(screen space)(使用變換後的坐标)、模型空間(model space)(使用未變換的坐标)以及世界空間(world space)(也是使用未變換的坐标)。

        你使用螢幕空間來将頂點映射到實際上螢幕坐标上。模型空間(也叫做局部空間,local space)表示你以任意一個代表模型的中心的原點為基準的坐标。局部空間中的頂點屬于一個模型,并且你可以随着物體移動這些定點以便進行準确的繪制。在渲染物體之前,你要将局部空間中的頂點轉換到世界空間中。在渲染物體之時,你講世界空間坐标轉換成螢幕空間坐标。

        位于世界空間中的頂點代表用于渲染一個物體的最後的位置。世界空間是3-D世界中圍繞一個固定點的實際位置。例如,把你自己想象成一個網格。你的關節是定義在局部空間中的頂點,因為它們可以用以你的胸部中心為原點的坐标進行定義。

        當你在你的房子(這就是世界空間)裡走動的時候,你的關節的坐标會在世界中移動,但是對你的身體來說仍然是局部的,如圖2.4所示。

DirectX 9.0c遊戲開發手記之RPG程式設計自學日志之5: Drawing with DirectX Graphics (用DirectX圖形繪圖)(第1節)

        在決定了使用什麼類型的坐标(螢幕、局部或者世界空間)來繪制一個物體後,你就開始放置頂點(以它們防止的順序來标号)。然後你将這些頂點以三個為一組進行連接配接來建立多邊形面。圖2.5展示了通過對頂點進行分組而建立的一對多邊形面。

DirectX 9.0c遊戲開發手記之RPG程式設計自學日志之5: Drawing with DirectX Graphics (用DirectX圖形繪圖)(第1節)

2.1.3 Lists,Strips, and Fans

        在建立多邊形面的時候你必須要考慮的一件事是頂點的共享(就是一個多邊形可以使用另外一個多邊形的一個或多個頂點)。一族多邊形面可以屬于三類之一:三角形列 (triangle lists),三角形帶(triangle strips)和三角形扇 (triangle fans)。

        三角形列是一族沒有公共頂點(但是你仍然可以讓這些頂點“重合”)的多邊形面,是以每一個多邊形都有自己的三個頂點。三角形帶是這樣一族有公共頂點的多邊形面,每一個多邊形都與另一個多邊形共享一條邊。三角形扇在一組多邊形面共享同一個頂點時出現,就如一把扇子共享其基點一樣。這三種類型在圖2.6中進行了展示。

DirectX 9.0c遊戲開發手記之RPG程式設計自學日志之5: Drawing with DirectX Graphics (用DirectX圖形繪圖)(第1節)

        除了使用三角形的多邊形外,你還可以渲染單個的點以及線條。Direct3D将你繪制的單個像素稱為點(points),而你繪制的線條稱為……好吧,線條(lines)。點和線條分别使用一個和兩個頂點來渲染到顯示屏上。因為我們主要關心3-D圖形,我就跳過了點和線條類型的多邊形,單單考慮三角形類型了。

2.1.4 VertexOrdering (頂點順序)

        稍後,當你進入渲染多邊形的過程時,你用于定義一個多邊形面的頂點的順序就會變得重要起來,因為你必須确定多邊形面的哪一個面是前面,哪一個面是後面。就你現在的目标而言,你要将定義一個多邊形面的頂點用順時針方向排序(當從多邊形的前面觀察的時候),如圖2.7所示。通過這種方式,如果構成多邊形的頂點是以順時針排序的話,你知道你在看着多邊形面的前面。

DirectX 9.0c遊戲開發手記之RPG程式設計自學日志之5: Drawing with DirectX Graphics (用DirectX圖形繪圖)(第1節)

        注意:

===============================================================================

        在一個3-D引擎中,一個面的背面一般是不會被繪制的,是以它在渲染過程中就被跳過了。這被稱為背面消隐(backface culling),并且是應該被執行的一個主要的優化。如果你在使用右手坐标系,那麼順時針的方向就反過來了,并且所有的多邊形面的頂點需要用逆時針方式進行排序。

===============================================================================

         機智的讀者很可能注意到了圖2.7中的三角形帶的頂點順序每過一個面就會反轉一次。這種頂點順序的反轉是使用Direct3D繪制三角形帶的要求。

2.1.5 ColoringPolygons (給多邊形着色)

        一旦你定義了一組多邊形或者一個網格,你就可以準備好給多邊形面着色了。Direct3D有兩種簡單的技術來實作這一點,我将在書中讨論。第一種與定義材質有關,一般來說是單色。材質有它們的漫反射光(diffuse)、環境光(ambient)和鏡面反射光(specular)顔色成分。漫反射光和環境光顔色一般來說是同種顔色——用來代表物體的實際顔色的光。鏡面反射光是一個附近的光照亮一個物體時産生的高亮顔色。(更多關于這些顔色成分的内容,參見本章稍後“材質和顔色”這一節。)

        第二種技術,叫做紋理映射(texture mapping),是關于用一張圖像來給多邊形塗色的。紋理映射通常是從一個bitmap格式(當然,現在早就不止這種格式了)檔案載入的圖像。這些bitmap圖像在多邊形面上伸展或者鑲嵌(tile)(重複)。

2.1.6 Transformations(變換)

        在你定義好一個模型(或者知識一族多邊形)後,你就可以準備好将它放置在世界中所需要的位置上了。圖2.8展示了幾個放置在3-D世界中的模型。隻要你樂意,你可以移動、縮放以及旋轉任何物體,是以你可以使用同一個模型來繪制一群有着不同的位置和朝向的物體。

DirectX 9.0c遊戲開發手記之RPG程式設計自學日志之5: Drawing with DirectX Graphics (用DirectX圖形繪圖)(第1節)

        你把移動(也叫做平移(translating))、旋轉以及縮放這些行為稱為變換(transformations)。要把一個物體從其模型空間帶到一組便于觀察的坐标上,需要進行好幾個變換。

        首先,要進行世界變換(worldtransformation),它是用來将局部坐标轉換到世界坐标的。這包括縮放,繞着x-、y-和z-軸旋轉,以及平移(明确地按照這種順序)。第二個要進行的變換是視角變換(view transformation),它讓所有的物體朝着3-D世界中的一個觀察點,這樣将世界坐标轉換成觀察坐标。

        将視角變換想象成漂浮在你的3-D世界中的一個錄影機。這個錄影機是你的虛拟世界的觀察入口,并且它可以自由地移動以及旋轉。視角變換将你的3-D世界的物體移動到相對于你的錄影機的位置上。

        最後一個重要的變換是投影變換(projectiontransformation),這是用于将3-D世界弄平為2-D圖像的變換。它運作起來很像錄影機的鏡片,with different zooms, short- and wide-angles, and various othereffects, such as fisheye distortion.(原諒我這句話不會翻譯。)

===============================================================================

好啦,費了這麼多筆墨,終于搞定了第一節。内容總體來說比較簡單,不過初學者仍然可能會感到吃力。其實這裡編排結構不是很合理。在此我推薦大家看看“龍書”第二版(Introduction to 3D Game Programming with DirectX 9.0c —— A Shader Approach)的第6章,那裡講述得更加清楚詳細。希望大家有所收獲!

繼續閱讀