1.3.2 Multisampling
由于使用像素矩陣來表示圖像,在顯示時會出現鋸齒狀,Multisampling就是使其變得平滑的技術。它的一種最普通的用法即為——全屏抗鋸齒(看圖1.3)。

D3DMULTISAMPLE_TYPE枚舉類型使我們可以指定全屏抗鋸齒的質量等級:
D3DMULTISAMPLE_NONE——不使用全屏抗鋸齒。
D3DMULTISAMPLE_1_SAMPLE…D3DMULTISAPLE_16_SAMPLE——設定1~16級的等級。
Defines the levels of full-scene multisampling that the device can apply.
typedef enum D3DMULTISAMPLE_TYPE
{
D3DMULTISAMPLE_NONE = 0,
D3DMULTISAMPLE_NONMASKABLE = 1,
D3DMULTISAMPLE_2_SAMPLES = 2,
D3DMULTISAMPLE_3_SAMPLES = 3,
D3DMULTISAMPLE_4_SAMPLES = 4,
D3DMULTISAMPLE_5_SAMPLES = 5,
D3DMULTISAMPLE_6_SAMPLES = 6,
D3DMULTISAMPLE_7_SAMPLES = 7,
D3DMULTISAMPLE_8_SAMPLES = 8,
D3DMULTISAMPLE_9__SAMPLES = 9,
D3DMULTISAMPLE_10_SAMPLES = 10,
D3DMULTISAMPLE_11_SAMPLES = 11,
D3DMULTISAMPLE_12_SAMPLES = 12,
D3DMULTISAMPLE_13_SAMPLES = 13,
D3DMULTISAMPLE_14_SAMPLES = 14,
D3DMULTISAMPLE_15_SAMPLES = 15,
D3DMULTISAMPLE_16_SAMPLES = 16,
D3DMULTISAMPLE_FORCE_DWORD = 0xffffffff,
} D3DMULTISAMPLE_TYPE, *LPD3DMULTISAMPLE_TYPE;
使用全屏抗鋸齒的功能將大大的降低了程序運行速度。如果你實在很想使用它的話,要記住使用IDirect3D9::CheckDeviceMultisampleType來檢測你的顯卡是否支持。
1.3.3像素格式
當我們創建一個表面或紋理時,經常需要指定這些Direct3D資源的像素格式。它是由D3DFORMAT枚舉類型的一個成員來定義的。這里例舉一部分:
D3DFMT_R8G8B8——表示一個24位像素,從左開始,8位分配給紅色,8位分配給綠色,8位分配給藍色。
D3DFMT_X8R8G8B8——表示一個32位像素,從左開始,8位不用,8位分配給紅色,8位分配給綠色,8位分配給藍色。
D3DFMT_A8R8G8B8——表示一個32位像素,從左開始,8位為ALPHA通道,8位分配給紅色,8位分配給綠色,8位分配給藍色。
D3DFMT_A16B16G16R16F——表示一個64位浮點像素,從左開始,16位為ALPHA通道,16位分配給藍色,16位分配給綠色,16位分配給紅色。
D3DFMT_A32B32G32R32F——表示一個128位浮點像素,從左開始,32位為ALPHA通道,32位分配給藍色,32位分配給綠色,32位分配給紅色。
想了解全部的像素格式請查看SDK文檔中的D3DFORMAT部分。
注意:這前三種格式(D3DFMT_R8G8B8、D3DFMT_X8R8G8B8、D3DFMT_A8R8G8B8)是最常用并為大部分顯卡所支持。但浮點像素格式或其它一些類型的支持并不是很廣泛,在使用它們前請先檢測你的顯卡,看是否支持。
1.3.4
內存池
表面和其它一些Direct3D資源被放在多種內存池中。內存池的種類由D3DPOOL枚舉類型的一個成員來指定。可用到的內存池有下列幾種:
D3DPOOL_DEFAULT——表示Direct3D將根據資源的類型和用途把它們放在最合適的地方。這有可能是顯存、AGP內存或者系統內存中。值得注意的是,這種內存池中的資源必須要在IDirect3DDevice9::Reset被調用之前消毀掉,并且再次使用時必須重新初始化。
D3DPOOL_MANAGED——資源將由Direct3D管理并且按設備的需要來指定放在顯存還是放在AGP內存中。當應用程序訪問和改變資源時它先把這些資源拷貝到系統內存中,當需要時Direct3D會自動把它們拷貝到顯存里。
D3DPOOL_SYSTEMMEM——指定資源放在系統內存中。
D3DPOOL_SCRATCH——指定資源放在系統內存中,它與D3DPOOL_SYSTEMMEM不同之處在于使用這些資源不必受圖形設備的限制。因此,參數使圖形設備不能訪問該內存池的資源,但資源可以相互拷貝。
AGP(Accelerate
Graphical Port),加速圖形接口。隨著顯示芯片的發展,PCI總線日益無法滿足其需求。英特爾于1996年7月正式推出了AGP接口,它是一種顯示卡專用的局部總線。嚴格的說,AGP不能稱為總線,它與PCI總線不同,因為它是點對點連接,即連接控制芯片和AGP顯示卡,但在習慣上我們依然稱其為AGP總線。AGP接口是基于PCI
2.1 版規范并進行擴充修改而成,工作頻率為66MHz。
AGP總線直接與主板的北橋芯片相連,且通過該接口讓顯示芯片與系統主內存直接相連,避免了窄帶寬的PCI總線形成的系統瓶頸,增加3D圖形數據傳輸速度,同時在顯存不足的情況下還可以調用系統主內存。所以它擁有很高的傳輸速率,這是PCI等總線無法與其相比擬的。
由于采用了數據讀寫的流水線操作減少了內存等待時間,數據傳輸速度有了很大提高;具有133MHz及更高的數據傳輸頻率;地址信號與數據信號分離可提高隨機內存訪問的速度;采用并行操作允許在CPU訪問系統RAM的同時AGP顯示卡訪問AGP內存;顯示帶寬也不與其它設備共享,從而進一步提高了系統性能。
AGP標準在使用32位總線時,有66MHz和133MHz兩種工作頻率,最高數據傳輸率為266Mbps和533Mbps,而PCI總線理論上的最大傳輸率僅為133Mbps。目前最高規格的AGP
8X模式下,數據傳輸速度達到了2.1GB/s。
AGP接口的發展經歷了AGP1.0(AGP1X、AGP2X)、AGP2.0(AGP
Pro、AGP4X)、AGP3.0(AGP8X)等階段,其傳輸速度也從最早的AGP1X的266MB/S的帶寬發展到了AGP8X的2.1GB/S。
AGP 1.0(AGP1X、AGP2X)
1996年7月AGP 1.0
圖形標準問世,分為1X和2X兩種模式,數據傳輸帶寬分別達到了266MB/s和533MB/s。這種圖形接口規范是在66MHz
PCI2.1規范基礎上經過擴充和加強而形成的,其工作頻率為66MHz,工作電壓為3.3v,在一段時間內基本滿足了顯示設備與系統交換數據的需要。這種規范中的AGP帶寬很小,現在已經被淘汰了,只有在前幾年的老主板上還見得到。
AGP2.0(AGP4X)
顯示芯片的飛速發展,圖形卡單位時間內所能處理的數據呈幾何級數成倍增長,AGP 1.0
圖形標準越來越難以滿足技術的進步了,由此AGP 2.0便應運而生了。1998年5月份,AGP
2.0 規范正式發布,工作頻率依然是66MHz,但工作電壓降低到了1.5v,并且增加了4x模式,這樣它的數據傳輸帶寬達到了1066MB/sec,數據傳輸能力大大地增強了。
AGP Pro
AGP
Pro接口與AGP 2.0同時推出,這是一種為了滿足顯示設備功耗日益加大的現實而研發的圖形接口標準,應用該技術的圖形接口主要的特點是比AGP
4x略長一些,其加長部分可容納更多的電源引腳,使得這種接口可以驅動功耗更大(25-110w)或者處理能力更強大的AGP顯卡。這種標準其實是專為高端圖形工作站而設計的,完全兼容AGP
4x規范,使得AGP 4x的顯卡也可以插在這種插槽中正常使用。AGP
Pro在原有AGP插槽的兩側進行延伸,提供額外的電能。它是用來增強,而不是取代現有AGP插槽的功能。根據所能提供能量的不同,可以把AGP
Pro細分為AGP Pro110和AGP Pro50。在某些高檔臺式機主板上也能見到AGP
Pro插槽,例如華碩的許多主板。
AGP 3.0(AGP8X)
2000年8月,Intel推出AGP3.0規范,工作電壓降到0.8V,并增加了8x模式,這樣它的數據傳輸帶寬達到了2133MB/sec,數據傳輸能力相對于AGP
4X成倍增長,能較好的滿足當前顯示設備的帶寬需求。
AGP接口的模式傳輸方式
不同AGP接口的模式傳輸方式不同。1X模式的AGP,工作頻率達到了PCI總線的兩倍—66MHz,傳輸帶寬理論上可達到266MB/s。AGP
2X工作頻率同樣為66MHz,但是它使用了正負沿(一個時鐘周期的上升沿和下降沿)觸發的工作方式,在這種觸發方式中在一個時鐘周期的上升沿和下降沿各傳送一次數據,從而使得一個工作周期先后被觸發兩次,使傳輸帶寬達到了加倍的目的,而這種觸發信號的工作頻率為133MHz,這樣AGP
2X的傳輸帶寬就達到了266MB/s×2(觸發次數)=533MB/s的高度。AGP
4X仍使用了這種信號觸發方式,只是利用兩個觸發信號在每個時鐘周期的下降沿分別引起兩次觸發,從而達到了在一個時鐘周期中觸發4次的目的,這樣在理論上它就可以達到266MB/s×2(單信號觸發次數)×2(信號個數)=1066MB/s的帶寬了。在AGP
8X規范中,這種觸發模式仍然使用,只是觸發信號的工作頻率變成266MHz,兩個信號觸發點也變成了每個時鐘周期的上升沿,單信號觸發次數為4次,這樣它在一個時鐘周期所能傳輸的數據就從AGP4X的4倍變成了8倍,理論傳輸帶寬將可達到266MB/s×4(單信號觸發次數)×2(信號個數)=2133MB/s的高度了。

目前常用的AGP接口為AGP4X、AGP
PRO、AGP通用及AGP8X接口。需要說明的是由于AGP3.0顯卡的額定電壓為0.8—1.5V,因此不能把AGP8X的顯卡插接到AGP1.0規格的插槽中。這就是說AGP8X規格與舊有的AGP1X/2X模式不兼容。而對于AGP4X系統,AGP8X顯卡仍舊在其上工作,但僅會以AGP4X模式工作,無法發揮AGP8X的優勢。
1.3.5
交換鏈和頁面切換
Direct3D通常創建2~3個表面組成一個集合,即為交換鏈,通常由IDirect3DSwapChain接口來表示。我們不必去了解它更詳細的細節。我們也很少去管理它,通常Direct3D會自己去管理。所以我們只要大概的了解一下它就可以了。
交換鏈以及頁面切換技巧被用在使兩幀動畫之間過度更平滑。圖1.4展示的是一個有兩個繪制表面的交換鏈。

如圖1.4,在Front
Buffer中的表面將用來在屏幕上顯示。顯示器不能即時顯示Front Buffer中表示的圖像;通常情況下,它是每六十分之一秒刷新顯示一次,即刷新率為60赫茲。應用程序的幀率經常與監視器的刷新率不同步(比如應用程序的渲染幀速度可能比顯示器的刷新速度快)。然而,我們不能在顯示器顯示完成當前幀之前就更新有下一幀動畫的Front
Buffer內容,但是我們又不想讓程序停止渲染而去等待顯示器顯示。因此,我們渲染另一個屏幕表面Back
Buffer。當監視器將Front Buffer顯示出來后,Front
Buffer就被放到交換鏈的末端,即變成圖中的Back Buffer,而Back
Buffer就會變成交換鏈中的Front Buffer。這個過程就叫做presenting。圖1.5表示了交換的整個過程。

因此,我們繪圖代碼的結構就會像下面這樣:
1.
Render to back buffer
2.
Present the back buffer
3.
Goto (1)
1.3.6
深度緩沖
深度緩沖也是一個表面,但它不是用來存儲圖像數據的,而是用來記錄像素的深度信息。它將確定哪一個像素最后被繪制出來。所以,如果要繪制640*480分辨率的圖片,那么就會有640*480個深度值。

圖1.6展示了一個簡單的場景,在這個場景里,一個物體把將另一個物體的一部分遮住了。為了使Direct3D能確定物體的前后關系并正確的繪制出來,我們使用一種深度緩沖,又叫做z-buffering的技術。
深度緩沖為每一個像素計算深度值,并進行深度測試。通過深度測試,我們可以比較出哪個像素離照相機更近,并將它畫出來。這樣就可以只繪制最靠近照相機的像素,被遮住的像素就不會被畫出來。
深度緩沖的格式決定著深度測試的精確性。一個24位的深度緩沖比16位的深度緩沖更精確。通常,應用程序在24位深度緩沖下就能工作的很好,但是Direct3D也同時支持32位的深度緩沖。
D3DFMT_D32——表示32位深度緩沖
D3DFMT_D24S8——表示24位深度緩沖并保留8位模版緩沖(stencil
buffer)
D3DFMT_D24X8——表示24位深度緩沖
D3DFMT_D24X4S4——表示24位深度緩沖并保留4位模版緩沖
D3DFMT_D16——表示16位深度緩沖
1.3.7
頂點處理
頂點是3D圖形學的基礎,它能夠通過兩種不同的方法被處理,一種是軟件方式(software
vertex processing),一種是硬件方式(hardware vertex processing),前者總是被支持且永遠可用,后者必須要顯卡硬件支持頂點處理才可用。
使用硬件頂點處理總是首選,因為它比軟件方式更快,而且不占用CPU資源,這意味CPU至少可以有更多的空閑時間進行別的計算。
注意:如果一塊顯卡支持硬件頂點處理的話,也就是說它也支持硬件幾何轉換和光源計算。
1.3.8
設備能力
Direct3D支持的每一項特性都對應于D3DCAPS9結構的一個數據成員。初始化一個D3DCAPS9實例應該以你的設備實際支持特性為基礎。因此,在我們的應用程序里,我們能夠通過檢測D3DCAPS9結構中相對應的某一成員來檢測設備是否支持這一特性。
下面將舉例說明,假設我們想要檢測顯卡是否支持硬件頂點處理(換句話說,就是顯卡是否支持硬件幾何轉換和光源計算)。通過查閱SDK中的D3DCAPS9結構,可以得知數據成員D3DCAPS9::DevCaps中的D3DDEVCAPS_HWTRANSFORMANDLIGHT位表示硬件是否支持硬件頂點處理即硬件幾何變換和光源計算。程序如下:
bool supportsHardwareVertexProcessing;
// If the bit is "on" then that implies the hardware device supports it.
if( caps.DevCaps & D3DDEVCAPS HWTRANSFORMANDLIGHT )
{
// Yes, the bit is on, so it is supported.
supportsHardwareVertexProcessing = true;
}
else
{
// No, the bit is off, so it is not supported.
hardwareSupportsVertexProcessing = false;
}
注意:DevCaps即為“device
capabilities。