天天看點

【DirectX 9.0學習之路(第一話)】——Direct3D初始化(上)Direct3D初始化(上)

Direct3D初始化(上)

一、Direct3D概述

        Direct3D是一套底層圖形API(Application Programming Interface, 應用程式程式設計接口),借助該API,我們能夠利用硬體加速功能繪制3D場景。Direct3D可以被視為應用程式與圖形裝置(3D硬體)互動的中介。下圖展示了三者之間的關系:

【DirectX 9.0學習之路(第一話)】——Direct3D初始化(上)Direct3D初始化(上)

圖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圖像資料的一個像素矩陣。(雖然我們可以将表面存儲點資料看成一個矩陣,但實際是存儲在一個線性數組中)

【DirectX 9.0學習之路(第一話)】——Direct3D初始化(上)Direct3D初始化(上)

圖1.2  表面

        用接口 IDirect3DSurface9來描述表面。該接口提供幾種直接從表面讀取和寫入資料的方法,以及一種擷取表面相關資訊的方法。主要方法如下:

        (1) LockRect        鎖定表面存儲區,以擷取指向表面存儲區的指針。         (2)UnlockRect    和LockRect方法配套使用,解除鎖定。         (3)GetDesc         該方法通過填充結構 D3DSURFACE_DESC 來擷取該表面的描述資訊。

        多重采樣         用像素矩陣表示圖像時,往往會出現塊狀效應。多重采樣能夠平滑塊狀圖像,常用于全屏反走樣。

【DirectX 9.0學習之路(第一話)】——Direct3D初始化(上)Direct3D初始化(上)

圖1.3 左邊是鋸齒線。右邊是經過多重采樣處理的反走樣線。

        D3DMULTISAMPLE_TYPE  枚舉類型包含了一系列枚舉常量值,用于表示對表面進行多重采樣的級别。

                 像素格式         建立表面和紋理時,需要指定這些Direct3D資源的像素格式。可以用  D3DFORMAT  枚舉類型的枚舉常量來表示。

【DirectX 9.0學習之路(第一話)】——Direct3D初始化(上)Direct3D初始化(上)

       記憶體池        表面和其他Direct3D資源可以放入許多類型的記憶體池中。記憶體池的類型可以用  D3DPOOL  枚舉類型表示。

【DirectX 9.0學習之路(第一話)】——Direct3D初始化(上)Direct3D初始化(上)

        交換連和頁面切換          交換連和頁面切換技術主要用于生成更加平滑的動畫。         完成繪制功能的程式結構為:         (1)在背景緩存中進行繪制。         (2)送出背景緩存的内容。         (3)循環(1)(2)步驟。

【DirectX 9.0學習之路(第一話)】——Direct3D初始化(上)Direct3D初始化(上)
【DirectX 9.0學習之路(第一話)】——Direct3D初始化(上)Direct3D初始化(上)

        深度緩存         深度緩存(depth  buffer)亦稱 z-緩存。為最終繪制的圖像中的每一個像素都保留了一個深度項。         深度緩存用于計算每個像素的深度值并進行深度測試。深度測試是根據深度值選出位于同一位置的像素應該顯示哪個。距離錄影機最近的像素獲勝。         深度緩存的格式決定深度測試的精度。但一般情況下,大多數應用程式采用24位深度緩存已經足以獲得滿意的結果。         

【DirectX 9.0學習之路(第一話)】——Direct3D初始化(上)Direct3D初始化(上)

        頂點運算         頂點運算有2種:(1)硬體頂點運算 (2)軟體頂點運算         硬體頂點運算隻有得到圖形卡的支援才能使用。         我們應該優先考慮硬體頂點運算,因為速度快、不占用CPU。

繼續閱讀