概述
舉個例子吧,骨灰級玩家(玩遊戲比較長的)以前在DOS下玩遊戲時,可不像我們現在,安裝上就可以玩了,他們往往首先要先設定音效卡的品牌和型號,然後還要設定IRQ(中斷)、I/O(輸入於輸出)、DMA(存取模式),如果哪項設定的不對,那么遊戲聲音就發不出來。這部分的設定不僅讓玩家傷透腦筋,而且對遊戲開發者來說就更頭痛了,因為為了讓遊戲能夠在眾多電腦中正確運行,開發者必須在遊戲製作之初,便需要把市面上所有音效卡硬體數據都收集過來,然後根據不同的 API(套用編程接口)來寫不同的驅動程式,這對於遊戲製作公司來說,是很難完成的,所以說在當時多媒體遊戲很少。微軟正是看到了這個問題,為眾廠家推出了一個共同的應用程式接口——DirectX,只要這個遊戲是依照Directx來開發的,不管你是什麼顯示卡、音效卡、統統都能玩,而且還能發揮更佳的效果。當然,前提是你的顯示卡、音效卡的驅動程式也必須支持DirectX才行。
3D加速卡就是硬體,也就是我們常說的顯示卡。
而作業系統和套用軟體通常不能直接去使用顯示卡和其中的3D加速功能,必須通過系統中的一個接口去調用,這就是OPENGL和D3D的作用了。
OPENGL和D3D對下可以通過顯示卡驅動程式操作顯示卡,對上可以為作業系統和各種應用程式提供各種顯示用的接口函式和顯示功能。
作業系統和套用軟體(包括遊戲)不需要知道這台電腦用的什麼顯示卡,只需要調用OPENGL或D3D提供的接口函式和功能就能實現顯示功能,通過這種分工合作,極大的降低了軟體開發周期和成本。比如需要在顯示器上畫出一個三維的正方體,不需要程式人員針對不同的顯示卡去寫大段的代碼,只需要調用OPENGL或D3D的一個函式並把一些相關的參數發給他們,由他們去完成這個事情就可以了。
OPENGL和D3D本質雖然一樣,但卻是不同的兩個標準。
發展歷史
OpenGL是近幾年發展起來的一個性能卓越的三維圖形標準,它是在SGI等多家世界聞名的計算機公司的倡導下,以SGI的GL三維圖形庫為基礎制定的一個通用共享的開放式三維圖形標準。目前,包括Microsoft、SGI、IBM、DEC、SUN、HP等大公司都採用了OpenGL做為三維圖形標準,許多軟體廠商也紛紛以OpenGL為基礎開發出自己的產品,其中比較著名的產品包括動畫製作軟體Soft Image和3D Studio MAX、仿真軟體Open Inventor、VR軟體World Tool Kit、CAM軟體ProEngineer、GIS軟ARC/INFO等等。
Direct3D (D3D):是微軟為提高3D 遊戲在Windows中的顯示性能而開發的顯示程式,目前已經升級到10.0版本,它提供了豐富的3D功能庫,是遊戲廣泛採用的標準。
DirectX進化之路
在directx誕生之初,業界已經有眾多標準,其中有兩個重要的標準:OpenGL和Glide,特別是前者,它被用於圖形、影像伺服器,製作電影、科教片等等,隨著技術逐漸成熟,越來越普及,如當時大名鼎鼎的Quake 3遊戲就是基於這個標準的。而當時的DirectX,很多硬體、主流遊戲都不支持它,沒有遊戲、沒有硬體,即使再有好的標準也是沒有意義的,DirectX的魅力一直沒有的到表現。但是它有微軟的支持推廣,它就有希望。 那么DirectX的發展,都經歷了哪些版本呢?
DirectX是目前民用市場的主流API
DirectX 1.0:第一代的DirectX很不成功,推出時眾多的硬體均不支持,當時基本都採用專業圖形API-OpenGL,缺乏硬體的支持成了其流行的最大障礙。DirectX 1.0版本是第一個可以直接對硬體信息進行讀取的程式,它提供了更為直接的讀取圖形硬體的性能(比如:顯示卡上的塊移動功能)以及基本的聲音和輸入設備功能(函式),使開發的遊戲能實現對二維(2D)圖像進行加速。這時候的DirectX不包括現在所有的3D功能,還處於一個初級階段。
DirectX 2.0:DirectX 2.0在二維圖形方面做了些改進,增加了一些動態效果,採用了Direct 3D的技術。這樣DirectX 2.0與DirectX 1.0有了相當大的不同。在DirectX 2.0中,採用了“平滑模擬和RGB模擬”兩種模擬方式對三維(3D)圖像進行加速計算的。DirectX 2.0同時也採用了更加友好的用戶設定程式並更正了應用程式接口的許多問題。從DirectX 2.0開始,整個DirectX的設計架構雛形就已基本完成。
Quake 2
DirectX 3.0:DirectX 3.0的推出是在1997年最後一個版本的Windows95發布後不久,此時3D遊戲開始深入人心,DirectX也逐漸得到軟硬體廠商的認可,97年時應用程式接口標準共有三個,分別是專業的OpenGL接口,微軟的DirectX D接口和3dfx公司的Glide接口。而那時的3dfx公司是最為強大的顯示卡製造商,它的Glide接口自然也受到最廣泛的套用,但隨著3dfx公司被NVIDIA的收購、Voodoo顯示卡的衰敗,Glide接口逐漸從人們眼中消失了。
古墓麗影 2
DirectX 5.0:令人奇怪的是,微軟公司並沒有如期推出DirectX 4.0,而是直接將DirectX版本升級到了5.0。此版本對Direct3D做出了很大的改動,加入了霧化效果、Alpha混合等3D特效,使3D遊戲中的空間感和真實感得以增強,還加入了S3的紋理壓縮技術。 同時,DirectX 5.0在其它各組件方面也有加強,在音效卡、遊戲控制器方面均做了改進,支持了更多的設備。因此,DirectX發展到DirectX 5.0才真正走向了成熟。此時的DirectX性能完全不遜色於其它3D API,而且大有後來居上之勢。
極品飛車3
DirectX 6.0:DirectX 6.0推出時,其最大的競爭對手之一Glide走向了沒落,而DirectX則得到了大多數廠商的認可和支持。DirectX 6.0中加入了雙線性過濾、三線性過濾等最佳化3D圖像質量的技術,遊戲中的3D技術逐漸走入成熟階段。這個時期具有代表性的產品是NVIDIA Riva TNT2系列。
DirectX 7.0:DirectX 7.0最大的特色就是支持T&L,該技術中文名稱是“坐標轉換和光源”。3D遊戲中的任何一個物體都有一個坐標,當此物體運動時,它的坐標發生變化,這指的就是坐標轉換。在T&L問世之前,位置轉換和燈光都需要CPU來計算,CPU速度越快,遊戲表現越流暢。使用了T&L功能後,這兩種效果的計算用顯示卡的GPU來計算,這樣就可以把CPU從繁忙的勞動中解脫出來。換句話說,擁有T&L顯示卡,使用DirectX 7.0,即使沒有高速的CPU,同樣能流暢的跑3D遊戲。 這個時代的代表性產品是GeForce 2系列和GeForce4 MX系列。
Counter-Strike
DirectX 8.0:DirectX 8.0的推出引發了一場顯示卡革命,它首次引入了像素渲染引擎(Vertex Shader)與頂點渲染引擎(Pixel Shader)的概念,反映在特效上就是動態光影效果。同硬體T&L僅僅實現的固定光影轉換相比,VS和PS單元的靈活性更大,它使GPU真正成為了可程式的處理器。這意味著程式設計師可通過它們實現3D場景構建的難度大大降低。通過VS和PS的渲染,可以很容易的寧造出真實的水面動態波紋光影效果。此時DirectX的權威地位終於建成,代表產品:GeForce4 Ti系列。
極品飛車6
DirectX 9.0:2002年底,微軟正式發布DirectX9.0,DirectX 9中PS單元的渲染精度已達到浮點精度,傳統的硬體T&L單元也被取消。全新的VertexShader(頂點著色引擎)編程將比以前複雜得多,新的VertexShader標準增加了流程控制,更多的常量,每個程式的著色指令增加到了1024條。另外,DX9增加對浮點數據的處理功能,以前只能對整數進行處理,突破了以前限制PC圖形圖象質量在數學上的精度障礙,它的每條渲染流水線都升級為128位浮點顏色,讓遊戲程式設計師們更容易更輕鬆的創造出更漂亮的效果,讓程式設計師編程更容易。
那么,即將從幕後走想台前的新一代DirectX 10又將給我們帶來什麼呢? ·DirectX 10技術詳解上
1、統一渲染架構
相對於其他方面的技術革新,微軟在Shader Model 4.0中引入的統一著色架構才是DX10最大的看點。我們都知道,微軟在directx 9中引入的了2.0/2.X/3.0三個版本的Vertex Shader(頂點著色引擎)以及Pixel Shader(像素著色引擎)。其中支持2.0版的著色引擎是DirectX 9的GPU的最低標準,而當前主流的顯示卡已經都硬體支持加入了擁有更多高級處理功能的3.0版本著色引擎。不過,即便是DirectX9.0c,對於功能相仿的Vertex Shader、Pixel Shader來說,目前圖形晶片廠商仍需要在GPU中劃分兩個區域來存放Vertex Shader陣列和Pixel Shader貼圖流水線。這無疑是一種資源冗餘,而且這也加重GPU的設計難度及成本。當Direct X10把渲染流程更細分為Vertex Shader、Geometry Shader及Pixel Shader,這個情況將會更為明顯。那么,有沒有可能把這兩者整合在一起呢?答案就是肯定的!
統一渲染架構是一項極具創新意義的作法。要知道,在很多時候如果我們處理的一個場景注意是以Pixel Shader計算為主,Vertex Shader計算僅占一小部分的時候,如果採用分離Shader設計的顯示核心,就可能存在Vertex Shader計算單元空閒,但Pixel Shader單元過渡計算的現象。同樣的也可能存在Pixel Shader數據比較少,但Vertex Shader計算數據過多的問題。這就往往造成了一方面著色單元閒置,另一方著色單元資源緊缺的情況。
統一渲染架構能更有效地利用顯示卡資源
比如在《上古捲軸4:湮沒》中,7900GTX在1600×1200+HDR的環境下,FPS僅為14~50幀左右。這是因為獨立渲染的草叢或者樹葉是由龐大數量的多邊形構成,對GPU的頂點渲染提出了嚴酷的要求,相對來說並不需要太多像素操作,如此一來大規模的像素渲染被閒置而頂點模組處於不堪重負狀態。而統一渲染架構則可以幫我們解決硬體資源上的限制----你能夠不受限制地使用紋理資源,並可以使用任意長度的著色指令,如果能夠將閒置的像素單元用來處理頂點,那么遊戲速度就不會如此可憐了!此外,統一渲染架構將令GPU的角色由單純為Game Rendering提升至Game Computing的理念,Unified Shading引擎設計更適合異類運算工作(Heterogeneous Computing),例如Physics運算、影像編碼運算等,讓顯示卡的套用範疇大幅提升。
2、虛擬顯存技術
眾所周知,在286/386時代,人們為了利用更多的記憶體,發明了虛擬定址技術,今天,這項技術被用到顯存身上,將如同當年般震撼,徹底地把顯存的利用帶到了全新的層次。以往,GPU採用直接記憶體調用法則,無論是紋理、頂點、多邊形、光影,都需要占用顯存空間,這些數據的運算量越大,占據的空間也越多。為了避免每次都需要重新計算,人們想到了MIP-MAP紋理映射的方法。當時,紋理貼圖的尺寸很小、3D場景亦沒有這么複雜,MIP-MAP能夠顯著地減少GPU計算量和顯存的占用。然而,隨著3D遊戲複雜性的增加,僅靠顯存已經無法存儲這些數據,不得不開發出AGP匯流排,利用部分記憶體作為AGP顯存,來暫時存儲紋理和頂點數據、補充顯存容量的不足。但別說以前的AGP 8X,即使是今天頻寬更大的PCI Express X16,亦遠遠不能與顯存頻寬相比。更為嚴重的問題是,為了同步處理,GPU會降低顯存的工作速度,使之與顯示卡顯存順利傳輸,所以一旦動用顯存,系統速度會大為下降。從這方面看,在遊戲中提升紋理調節的時候,必須注意自己的顯存容量,比如你要玩FarCry、戰地1942、等遊戲,沒有256MB顯存,就別想把畫質設定到最高,否則會大大地影響遊戲速度。
因此,微軟根據虛擬記憶體管理方法將在DirectX 10中引入虛擬顯存技術。它可以很好的解決以上所提到的問題,所有的紋理、著色等都分成“小塊”數據即使在低速匯流排上也能流暢傳輸。例如,一個4KB大小的頁面相當於一個32×32×32bit大小的紋理貼圖,這樣大小的紋理貼圖已經可以滿足需要,這樣在需要紋理渲染時系統就不需要傳輸太多"頁面"就可以完成相應的工作,而做到這一切幾乎不會損失性能。
G80的Video Memory執行示意圖
而且將虛擬顯存技術與著色引擎搭配也是一個很具創新性的想法。在顯存中,著色器指令是被當作一個抽象的數據塊進行處理的,系統並不理會“數據塊”能否裝得進GPU的指令流水線,一旦著色器被載入,它就會在每個頂點以及象素上操作、直至卸載。因此要想完成更長的著色器指令就需要增加GPU的指令執行管數或利用自動多路形式將指令劃分成若干個可管理的小塊。由於GPU的指令執行管數在設計之時就固定好,如果要增加執行管數無疑需要重新設計及增加電晶體數,顯然第一種方法並不太實用。因此第二種方法較為實用,而這也與我們所提到的虛擬顯存系統實際是一樣的。為了適應著色器指令的執行套用,虛擬顯存被劃分為許多相對獨立的頁面。假定圖形處理單元當中設定的指令執行管道可以執行整個頁面所包含的指令,那么我們的著色器操作就可以建立起一套流水線式的運作機制,載入一個頁面,然後運行,停止下來之後再載入一個新的頁面,然後運行,如此反覆指導全部包含指令的頁面被載入到處理器當中,此間,執行管道的作用與處理器的L1 Cache相當類似,而整個運作流程和處理器的可以說是一致的。
通過虛擬顯存技術,著色指令的長度將可以不受指令執行管數的限制,存儲系統可以存放的圖象紋理可以更多,定址的方式變得輕鬆簡單,於是我們的DirectX10技術就實現了可用資源“不受限制”的強大功能。當然了,資源的“不受限制”還是受到硬體實際可用資源的限制。指令太長的話,GPU就需要多次載入指令頁面,這樣也會造成性能大幅度下降;如果紋理數據太多,需要用到系統記憶體、甚至是硬碟空間進行存儲的話,那么整個圖形子系統的性能也會下降。針對這個問題,微軟為資源限制定了兩個門限:只要不超過第一個限定,系統都能夠工作;而超過第二個限定時,系統就不能夠正常工作(在640×480解析度下,fps值不足10)。其實,此前已經有廠商使用了虛擬顯存技術,3Dlab的專業級顯示卡野貓WildCat VP就能調度16GB虛擬顯存,16GB喔,在主流顯存不過256MB的時代,這是多么振奮人心的事情。很明顯當你能完全使用全部16GB時,相信系統瓶頸問題已經不在此了。 ·DirectX 10技術詳解中
3、整數指令集
除了統一渲染架構和虛擬顯存,DX10還有不少改進之處,其中最重要的莫過於整數指令集。也許你會覺得奇怪,整數指令集不是所有計算的基礎嗎?對於CPU而言,這是沒錯的,但別忘記了,當然為何引入浮點處理器和多媒體指令集,原因是圖形運算需要大量的浮點指令。浮點是不精確數據類型,當尋值數據與紋理數據不符合的時候,可以採用近似值和多個數據計算的內插值來代替,對圖形最終畫面沒有影響,此類速度也比整數要快。因此,GPU的基礎恰好與CPU相反,是以浮點指令為主的。目前,著色器所處理的所有東西都需要依靠浮點運算所完成(除了靜態分支預測試運算之外)。
在大多數的圖像處理上來說,這種處理方式是沒有問題的。但進行動態分支預測或非內插式記憶體搜尋時(比如對頂點快取器進行定位索引時),這種浮點運算處理方式就存在很大的問題。而DX10中引入整數運算將有許多好處,比如進行動態/靜態分支預測、頂點快取定位、通用記憶體定址方面,浮點是無法進行精確計算的。
4、直接存取像素著色幀快取
現在的渲染模式,主要是實時渲染,每種渲染工作都是實時完成的,中間無法打斷,如果我們想為圖像增加數字分級、色彩校正或顏色調節等工作,只能重新進行一次計算,對整體工作造成了延時。事實上,當你讀取渲染中圖象的紋理數據,大多數的GPU和驅動程式都可以工作。但這屬於非法操作(沒有經過定義),這樣的操作隨時可能被中斷,而開發人員通常不會使用這項功能。
DX9時代的解決方案有二,第一種是使用兩個獨立的紋理,一個紋理用於正常工作,另一個備用紋理應付那些附加的計算,此方案的最大問題是必須占用兩倍顯存空間;第二種是在Pixel Shader中通過模擬混合函式的實現以上功能。ATi已經在他們的GPU晶片中加入了類似的做法,他們通過頂點著色引擎來模擬原有的固定頂點處理函式。這樣就意味著GPU設計廠商需要在著色引擎上增加額外的電晶體來實現以上的功能。
DX10則轉向了新思路:使用了像素描影器直接存取幀快取的方式來部分代替以前的實時渲染,某些情況下,我們可以隨時中斷渲染,加入我們想要的效果,再繼續運算,不對整個渲染過程造成影響,使渲染變得更為靈活和可控。但並不意味著在directx10中進行實時渲染模式就毫無問題,並且廠商可能放棄了對這種技術的支持。那樣這項技術很可能以一種備選方案出現,如此一來,程式設計師可能會忽略這項技術的存在而繼續沿用老方法。 ·DirectX 10技術詳解下
5、增強型圖形鑲嵌技術
在DX8時代,為了提高曲線畫面的真實度,顯示卡廠商增引入了高階曲面技術,如:nVidia的RT-Patch和ATi的N-Patch。從本質上看,它們把曲線處理帶入了一種新紀元,看看現有的真實世界,並不總是以方方正正的多邊形存在的,很多地方都由曲面來構建,才使真實的物體種類更為多樣,很難想像我們有一個四方頭的時候是怎樣的恐怖。然而,每次的技術進化總是有一定阻礙,高階曲面在當時未能完善,甚至導致了畫面產生變形。因此不少開發商都這種技術失去了興趣,而圖形晶片廠商最終也放棄對這項技術的硬體支持。直到directx 9引入適應圖形鑲嵌以及置換貼圖技術,這兩項技術再次被人們所關注。高階曲面鑲嵌以及置換貼圖這兩項技術雖然在NVIDIA的GF6/7系列、ATI的X1000系列圖形晶片中得到支持,但當前DirectX技術在支持高階曲面上仍存在一定問題。
雖然高階曲面未能正式流行,而為它的自適應圖形鑲嵌和置換貼圖兩項獨特的技術卻引起了人們的興趣。自適應圖形鑲嵌可以按照我們的要求,進行不同的紋理鑲嵌,以便取得更佳的視覺效果,將使3D世界進一步擬真化,可是,它們遇到的最大問題,依然是高階曲面的運算,如何使用最小的運算又不導致畫面破損和變形,是DX10極須解決的問題。DX10的硬體將支持各種通用高階曲面計算:Catmull-Rom曲面、貝賽爾曲線、B-Splines曲線、圓錐曲線,證明高階曲面回歸的時代已經到來,只是要我們去認真地進行最佳化而己,當然這些也需要圖形晶片進行硬體支持。
6、Physics(物理加速)技術
最近熱門的技術就是物理加速及其套用,物理計算是下一代遊戲體驗當中的關鍵部分,它將增加遊戲的真實感、沉浸感和帶來更加有趣的體驗。NVIDIA同樣對物理加速非常感興趣,在未來的DX10產品中會加入物理加速的支持。
G80已經能從硬體層面支持物理運算
雖然,物理加速的概念很早之前就已經提出,但時至今日依然處於概念性階段——AGEIA的物理加速卡僅有幾款遊戲能夠支持,而ATI的GPU物理加速才剛剛進行完Demo演示,NVIDIA的SLI物理加速也要等待遊戲廠商採用Havok FX引擎才能夠出台!推廣進程如此緩慢因為標準的不統一。AGEIA和Havok兩大陣營的物理加速引擎互不兼容、各自為政,這就使得很多遊戲僅能支持一種物理引擎,這種情形非常類似於3D時代開荒初期在技術和規範上百花齊放!
這一現狀有望在DX10推出之後得到改善,有了微軟API的支持,無論哪種物理引擎都擁有發揮的空間,相信將會有更多的遊戲加入更多的物理運算。未來,DX10 GPU將是更趨向化通用型的處理器,也就是說,原本許多交由CPU進行的3D處理會被轉移到GPU上面來,因為強大的GPU比CPU更適合做這些工作,由此遊戲性能會大幅提高。微軟表示,DX10會開放兩個SDK,分別照顧到AGEIA和Havok,其中AGEIA的PPU直接作用於SDK獨立進行物理運算,在Havok引擎的調動下NVIDIA的GPU也可以動態的處理物理運算!