DirectX9.0學習筆記

來源:互聯網
上載者:User

第1章:建立和管理Direct3D裝置

1.1  什麼是Direct3D裝置

每個圖形API都有一個維持繪圖功能整體狀態的實體。如Windows GDI用的是DC,Java用的是Graphics對象,而DirectX用的就是IDirect3DDevice9(這個數字表版本)。Direct3D裝置管理並維護從分配紋理記憶體到變換矩陣再到混合狀態的一切事情。它有3種基本類型:

  • D3DDEVTYPE_HAL:使用硬體進行渲染,功能實現依賴硬體。
  • D3DDEVTYPE_REF:提供了全部功能,用軟體類比所有可能的DirectX特性。
  • D3DDEVTYPE_SW:使用第三方的軟體渲染器。

1.2  如何使用Direct3D裝置

  • 第一步:建立Direct3D對象。(使用Direct3DCreate9函數)
  • 第二步:瞭解更多硬體資訊。(有GetDeviceCap和EnumAdapterMode兩個函數)
  • 第三步:建立Direct3D裝置。(CreateDevice函數及D3DPRESENT_PARAMETERS結構)
  • 第四步:重設丟失的裝置。(TestCooperativeLevel查詢裝置狀態,Reset恢複)
  • 第五步:銷毀裝置。 (Release)

1.3  使用Direct3D裝置進行渲染

  • 使用BeginScene() 開始渲染。
  • 使用EndScene()結束渲染。
  • 使用Present通知裝置將圖形繪製在螢幕上

第2章:一切從頂點開始

2.1  什麼是頂點

頂點可以被定義為空白間中的點,作為渲染點、線和面的構造單元。頂點格式定義了頂點的屬性。在DirectX中,可以改變該資料結構的格式以符合特定渲染任務的要求,稱之為靈活頂點格式(Flexible Vertex Formats, FVFs)。要注意,必段按DirectX定義的順序來列出這些FVF標識。

2.2  建立頂點

  • 建立頂點緩衝區

實際需要做的是建立頂點緩衝區,圖形裝置試圖將緩衝區放入顯存或者是加速圖形介面的記憶體中,能確保顯卡可以儘可能快地獲得資料。可以通過CreateVertexBuffer來建立頂點緩衝區。

  • 設定和改變頂點

因為頂點緩衝區可以存在於顯存或存在於由裝置管理的記憶體中,所以不能直接改變頂點資料的取值。為了訪問這些取值,必須調用Lock函數,它返回指向頂點的指標,可以用它改變頂點資料的值。一旦設定了頂點值,可以調用解鎖函數Unlock函數,將新的資料返回給裝置。

2.3  渲染頂點

  • 通知裝置頂點被儲存在何處,可以用SetStreamSource來實現這個目標。將頂點緩衝區和資料流進行串連,將幾何體的資訊傳輸到繪製流水線中。
  • 設定靈活頂點格式,通知裝置正在處理的頂點類型,調用SetFVF實現。
  • 讓裝置實際繪製頂點,使用DrawPrimitive函數。

2.4  效能考慮

總原則:批處理就是一切。總是在單次調用中將所做的工作最大化,而將迫使裝置切換到新狀態的次數最小化。

第3章:使用變換

3.1  變換意味著什麼

在3D圖形學中,利用世界變換來決定物體在情境中的位置,利用觀察變換來決定相機的位置,利用設影變換來決定相機“鏡頭”的特性,用視口將資訊映射到實際的像素。

  • 世界變換

世界矩陣最基本的用法是在一個虛擬空間中簡單地移動一個預定義的物體,但是還有一個好處,可以很容易地利用它通過使用一個頂點緩衝和幾個不同的變換矩陣來繪製同一個物體的多個執行個體。雖然硬體必須多次變換頂點,但是使用一套幾何體可以節約記憶體和顯卡的頻寬。

  • 觀察變換

鑒於世界變換定義了空間中物體的位置和取向,觀察變換定義了在空間中的相機的位置和取向。經過世界變換以後,被轉換為全局座標的頂點,被稱為經過觀察變換後眼中座標的頂點。一旦一個物體在眼座標中,就可以知道在物體與觀察者之間的基本幾何關係。換句話說,可以使用世界變換在構建一個3D世界,使用觀察變換在這個世界中移動相機。

  • 投影變換

投影矩陣將虛擬相機的特性進行編碼,這些屬性建立了一個觀察截頭體,它是相機可觀察的空間體積。遠平面和近平面定義了物體的可見距離,太遠或太近的物體不會被包括到最終的渲染中。視野(FOV)角度定義了觀察的寬度和高度。D3DX庫中包含了建立投影矩陣的10個不同的函數。5種類型中的每一類都有左手系和右手系兩個版本。

3.2  變換與3D裝置

一旦具有變換矩陣,就可以通過SetTransform來設定變換,它的第一個參數指定應該被設定的變換,有三種:D3DTS_PROJECTION,D3DTS_VIEW,D3DTS_WORLD。可以使用D3DX庫中的ID3DXMatrixStack的協助介面來實現一個矩陣堆棧,從而管理一個複雜的變換。

3.3  視口

一旦三個變換步驟完成以後,裝置仍需要決定資料最終是如何被映射到每個象素上的,這時要定義一個視口來協助裝置完成這項工作。在正常情況下,視口由視窗模式應用中的視窗大小來定義,或者由全螢幕模式應用中的螢幕解析度來定義,因此在很多時候並不需要明顯地設定視口。然而,DirectX允許程式員指定視窗的一部分作為視口,當在同一視窗中渲染多個情境時這樣的指定是有用的。

視口用D3DVIEWPORT結構來定義,該結構定義了在視窗或螢幕之內視口的矩形部分,以及近Z平面和遠Z平面。可以用SetViewport來設定一個新的視口,此時,常常用GetViewport來儲存舊視口的一個拷貝。要注意的是,視口的維度比例應該符合投影矩陣的特徵比例,如果不符合,物體看起來就會像壓扁一樣。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.