Direct3D初始化(上)
一、Direct3D概述
Direct3D是一套底層圖形API(Application Programming Interface, 應用程式程式設計接口),借助該API,我們能夠利用硬體加速功能繪制3D場景。Direct3D可以被視為應用程式與圖形裝置(3D硬體)互動的中介。下圖展示了三者之間的關系:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyMyMDN0kDMwIDMzITM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
圖1.1 應用程式、Direct3D、硬體三者關系
圖1.1中的Direct3D部分是一套已定義好的、由Direct3D提供給應用程式/程式設計人員的接口和函數,這些接口和函數代表了目前版本的Direct3D所支援的全部功能。 在Direct3D和圖形裝置之間有一個HAL(Hardware Abstraction Layer, 硬體抽象層)。因為市面上的顯示卡種類繁多,每種卡的性能和同樣功能實作有差異,是以需要定義一個統一的标準HAL,使得Direct3D不用關心顯示卡類型,其規範的制定可獨立于具體的硬體。
有時,Direct3D提供的某些功能不為您的圖形裝置所支援,但您仍希望使用這些功能。為了滿足這種需求,Direct3D提供了REF裝置,即參考光栅裝置(reference asterizer device)。它能夠以軟體運算方式完全支援Direct3D API 。不過,REF裝置僅用于開發階段,它與Direct3D SDK捆綁在一起,無法釋出給最終使用者。此外,REF裝置速度十分緩慢,在測試以外的場合都很不實用。
二、COM(元件對象模型)
COM(Component Object Model, 元件對象模型),是一項能夠使DirectX獨立于程式設計語言并且向下相容的技術。通常稱為COM對象接口,可将其視為一個C++類來使用。建立COM接口時不能使用關鍵字 new。并且使用完一個接口,應該調用相應的Release方法,而不是使用C++中的delete。(所有的COM接口都繼承自COM接口IUnknown ,該接口提供了Release方法)。 所有的COM接口都有一個字首 I 。
三、預備知識
表面 表面是Direct3D存儲2D圖像資料的一個像素矩陣。(雖然我們可以将表面存儲點資料看成一個矩陣,但實際是存儲在一個線性數組中)
圖1.2 表面
用接口 IDirect3DSurface9來描述表面。該接口提供幾種直接從表面讀取和寫入資料的方法,以及一種擷取表面相關資訊的方法。主要方法如下:
(1) LockRect 鎖定表面存儲區,以擷取指向表面存儲區的指針。 (2)UnlockRect 和LockRect方法配套使用,解除鎖定。 (3)GetDesc 該方法通過填充結構 D3DSURFACE_DESC 來擷取該表面的描述資訊。
多重采樣 用像素矩陣表示圖像時,往往會出現塊狀效應。多重采樣能夠平滑塊狀圖像,常用于全屏反走樣。
圖1.3 左邊是鋸齒線。右邊是經過多重采樣處理的反走樣線。
D3DMULTISAMPLE_TYPE 枚舉類型包含了一系列枚舉常量值,用于表示對表面進行多重采樣的級别。
像素格式 建立表面和紋理時,需要指定這些Direct3D資源的像素格式。可以用 D3DFORMAT 枚舉類型的枚舉常量來表示。
記憶體池 表面和其他Direct3D資源可以放入許多類型的記憶體池中。記憶體池的類型可以用 D3DPOOL 枚舉類型表示。
交換連和頁面切換 交換連和頁面切換技術主要用于生成更加平滑的動畫。 完成繪制功能的程式結構為: (1)在背景緩存中進行繪制。 (2)送出背景緩存的内容。 (3)循環(1)(2)步驟。
深度緩存 深度緩存(depth buffer)亦稱 z-緩存。為最終繪制的圖像中的每一個像素都保留了一個深度項。 深度緩存用于計算每個像素的深度值并進行深度測試。深度測試是根據深度值選出位于同一位置的像素應該顯示哪個。距離錄影機最近的像素獲勝。 深度緩存的格式決定深度測試的精度。但一般情況下,大多數應用程式采用24位深度緩存已經足以獲得滿意的結果。
頂點運算 頂點運算有2種:(1)硬體頂點運算 (2)軟體頂點運算 硬體頂點運算隻有得到圖形卡的支援才能使用。 我們應該優先考慮硬體頂點運算,因為速度快、不占用CPU。