概述
如果沒有3D API在開發程式時,程式設計師必須要了解全部的顯示卡特性,才能編寫出與顯示卡完全匹配的程式,發揮出全部的顯示卡性能。而有了3D API這個顯示卡與軟體直接的接口,程式設計師只需要編寫符合接口的程式代碼,就可以充分發揮顯示卡的不必再去了解硬體的具體性能和參數,這樣就大大簡化了程式開發的效率。
同樣,顯示晶片廠商根據標準來設計自己的硬體產品,以達到在API調用硬體資源時最最佳化,獲得更好的性能。有了3D API,便可實現不同廠家的硬體、軟體最大範圍兼容。比如在最能體現3D API的遊戲方面,遊戲設計人員設計時,不必去考慮具體某款顯示卡的特性,而只是按照3D API的接口標準來開發遊戲,當遊戲運行時則直接通過3D API來調用顯示卡的硬體資源。
3D API能讓編程人員所設計的3D軟體只要調用其API內的程式,從而讓API自動和硬體的驅動程式溝通,啟動3D晶片內強大的3D圖形處理功能,從而大幅度地提高了3D程式的設計效率。幾乎所有的3D加速晶片都有自己專用的3D API,目前普遍套用的3D API有DirectX、OpenGL、Glide、Heidi等。
•DirectX
微軟公司專為PC遊戲開發的API,與Windows作業系統兼容性好,可繞過圖形顯示接口(GDI)直接進行支持該API的各種硬體的底層操作,大大提高了遊戲的運行速度,而且目前基本上是免費使用的。由於要考慮與各方面的兼容性,DirectX用起來比較麻煩、在執行效率上也未見得最優。
•OpenGL (開放式圖形接口)
由Silicon Graphics公司開發,能夠在Windows 95、Windows NT、Macos、Beos、OS/2、以及Unix上套用的API。由於OpenGL起步較早,一直用於高檔圖形工作站,其3D圖形功能很強,超過DirectX,能最大限度地發揮3D晶片的巨大潛力。在Windows中已經全面支持DirectX和OpenGL。在OpenGL的1.2版中還增加了對3DNow!標準的支持。
•Glide
這是3Dfx公司為VOODOO系列3D加速卡設計的專用3D API,它可以最大限度發揮VOODOO系列晶片的3D圖形處理功能,由於不考慮兼容性,其工作效率遠比OpenGL和Direct 3D高,所以Glide是各3D遊戲開發商優先選用的3D API。不過,這樣一來就使得許多精美的3D遊戲在剛推出時,只支持3Dfx公司的VOODOO系列3D加速卡,而其它類型的3D加速卡則要等待其生產廠商提供該遊戲的補丁程式。
•Heidi
Heidi是一個由Autodesk公司提出來的規格。目前,採用Heidi系統的應用程式包括3D Studio MAX動畫製作程式、Autodesk公司為AutoCAD R13開發的WHIP加速驅動程式。
特性
•Alpha Blending (α混合)
簡單地說這是一種讓3D物件產生透明感的技術。螢幕上顯示的3D物件,每個像素中有紅、綠、藍三組數值。若3D環境中允許像素能擁有一組α值,我們就稱它擁有一個α通道。α值的內容,是記載像素的透明度。這樣一來使得每一個物件都可以擁有不同的透明程度。比如說,玻璃會擁有很高的透明度,而一塊木頭可能就沒什麼透明度可言。α混合這個功能,就是處理兩個物件在螢幕畫面上疊加的時候,還會將α值列入考慮,使其呈現接近真實物件的效果。
•Fog Effect (霧化效果)
霧化效果是3D的比較常見的特性,在遊戲中見到的煙霧、爆炸火焰以及白雲等效果都是霧化的結果。它的功能就是製造一塊指定的區域籠罩在一股煙霧瀰漫之中的效果,這樣可以保證遠景的真實性,而且也減小了3D圖形的渲染工作量。
•Shading(著色處理)
絕大多數的3D物體是由多邊形(polygon)所構成的,它們都必須經過某些著色處理的手續,才不會以線結構(wire frame)的面目示人。著色處理分為Flat Shading平面著色、Gouraud Shading高洛德著色。
1.Flat Shading (平面著色):平面著色是最簡單也是最快速的著色方法,每個多邊形都會被指定一個單一且沒有變化的顏色。這種方法雖然會產生出不真實的效果,不過它非常適用於快速成像及其它要求速度重於細緻度的場合。
2.Gouraud Shading (高洛德著色): 這種著色的效果要好得多,它可對3D模型各頂點的顏色進行平滑、融合處理,將每個多邊形上的每個點賦以一組色調值,同時將多邊形著上較為順滑的漸變色,使其外觀具有更強烈的實時感和立體動感,不過其著色速度比平面著色慢得多。
•Mapping(貼圖處理)
分為Texture Mapping材質貼圖、Mip Mapping Mip貼圖、Bump Mapping凹凸貼圖、Video Texture Mapping視頻材質貼圖。
1.Texture Mapping (材質貼圖):是在物體著色方面最引人注意、也是最擬真的方法,同時也多為目前的遊戲軟體所採用。一張平面圖像(可以是數位化圖像、小圖示或點陣點陣圖)會被貼到多邊形上。例如,在賽車遊戲的開發上,可用這項技術來繪製輪胎胎面及車體著裝。
2.MIP MAPPING (MIP貼圖) 這項材質貼圖的技術,是依據不同精度的要求,而使用不同版本的材質圖樣進行貼圖。例如:當物體移近使用者時,程式會在物體表面貼上較精細、清晰度較高的材質圖案,於是讓物體呈現出更高層、更加真實的效果;而當物體遠離使用者時,程式就會貼上較單純、清晰度較低的材質圖樣,進而提升圖形處理的整體效率。LOD(細節水平)是協調紋理像素和實際像素之間關係的一個標準。一般用於中、低檔顯示卡中。
3.Bump Mapping凹凸貼圖
(1) 浮雕貼圖(Emboss bump mapping)
這種處理方式不用lighting models,而直接使用貼圖明暗度來產生凸凹效果.玩過photoshop的都知道可以使用alpha通道對RGB圖像進行混合,這種透明度直接混合出來的明暗看起來象平的,為了使用圖像隨燈光看起來有立體感的明暗度,一種簡單的辦法就是使用Emboss bumpmapping.
實現如下:
就是將原alpha通道值一分為二,一個是原alpha通道的亮度減半, 另一個是反轉alpha通道並將uv偏移燈光一點點,最後將兩個alpha通道加起來再與原RGB圖像進行混合,這樣看起來明暗度偏離燈光使看起來立體感較強.另外這樣的處理方式還可混合頂點色.
優缺點:
CPU使用較多,計算uv偏移值,可以直接用固定管道實現. 完全用貼圖渲染,只實現了diffuse.
(2) 環境凹凸貼圖(EMBM: Environment-mapped bump mapping)
這種貼圖保存了du和dv兩個偏差值,最常見的是用在水的反射渲染中對反射圖進行乾撓.使水面看起來產生漣漪的效果. 就是說dv和dv將會加到頂點對應反射圖的uv中. dx中可以設定bump矩陣對它調整得以實時變化.
優缺點:
CPU占用少,可以使用固定管道實現.效率問題主要是在反射圖(也就是Environment map)的渲染占用上,當然也可以採用假的靜態反射圖.
(3) 法線圖(Normal mapping)
這種是比較流行的實時凹凸貼圖方法,原理很簡單,就是多邊形上每一象素點如果用不同的法向量進行光照模型運算,那么就可得到不同的凹凸明暗度.
實現方法:
就是將多邊形的法線保存在高點陣圖的RGB中.然後程式讀取來在ps中取出RGB作為法線進行光照模型的計算即可.
法線圖中的法線值一般是以貼圖空間(也就是切線空間,U為tangent向量,V為binormal向量, n為normal向量)來存放的,所以燈光到頂點的向量要先轉到切線空間後再與法線進行光照運算即可.
優缺點:
CPU使用不多,用點光源效果較好, 需要硬體支持DotProduct, 光照實時變化.
(4) 置換貼圖(Displacement mapping)
這種需要硬體支持,在vs中真正改變幾何頂點的位置, 由此引起的幾何細分需要處理大量的多邊形,一般不能實時套用到.
(5) 自陰影(Self-shadowing bump maps)
法線圖可以實現陰影動態變化,但實現不了自陰影,也就是說如果有凸塊遮擋了光線,它不能實現遮擋產生的陰影.
一種叫horizon map的技術可以實現自陰影.
這是一種從特定點向各方向記錄可見水平高度(the elevation of the visible horizon)的紋理。
光源如果低於這個水平高度,就不會照亮對應的特定點。這可在切線空間對光源向量執行這種可見性檢查,
就可以產生自陰影bump maps.
優缺點:
實現自陰影,占用過多紋理記憶體,計算量很大。
(6) 視差映射(Parallax mapping)
Parallax mapping也被稱為"offset mapping"或"virtual displacement mapping"這種處理是將紋理的坐標向眼睛方向偏移一定的距離來實現立體視角感.
從渲染點出發到眼睛的斜射線上找到表面垂直距離等於渲染點對應的Parallax mapping高度值時,那么眼睛斜射線上到表面垂直相交的那點就是要偏移到的地方.(可參見前面所附連結中的圖示)
優缺點:
視差映射跟EMBM一樣也是調整貼圖UV坐標的,不過它有兩個約束條件:一是對應視差映射中的高度值二是到眼睛的射線. 從而隨視角變化而變化,效果效率都很好. 而EMBM一般用正/餘弦波來改變du/dv後再去影響貼圖坐標從而達到水的漣渏效果(這在前面有說)
(7) Z-correct bump mapping
這種是在ps中根據視線方向偏移Z值,使物體相交處會隨著表面的凹凸情況發生變化而不僅僅表示為一條直線。
優缺點:
物體相交處通過z偏移表現凹凸變化,在pixel shader中修改Z值會禁止圖形硬體的早期深度測試最佳化.
4.Video Texture Mapping視頻材質貼圖,這是目前最好的材質貼圖效果。具有此種功能的圖形圖像加速卡,採用高速的圖像處理方式,將一段連續的圖像(可能是即時運算或來自一個AVI或MPEG的檔案)以材質的方法處理,然後貼到3D物件的表面上去。
主要套用
一、DirectX
DirectX並不是一個單純的圖形API,它是由微軟公司開發的用途廣泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多個組件,它提供了一整套的多媒體接口方案。只是其在3D圖形方面的優秀表現,讓它的其它方面顯得暗淡無光。DirectX開發之初是為了彌補Windows 3.1系統對圖形、聲音處理能力的不足,而今已發展成為對整個多媒體系統的各個方面都有決定性影響的接口。
DirectX 5.0
微軟公司並沒有推出DirectX 4.0,而是直接推出了DirectX 5.0。此版本對Direct3D做出了很大的改動,加入了霧化效果、Alpha混合等3D特效,使3D遊戲中的空間感和真實感得以增強,還加入了S3的紋理壓縮技術。同時,DirectX 5.0在其它各組件方面也有加強,在音效卡、遊戲控制器方面均做了改進,支持了更多的設備。因此,DirectX發展到DirectX 5.0才真正走向了成熟。此時的DirectX性能完全不遜色於其它3D API,而且大有後來居上之勢。
DirectX 6.0
DirectX 6.0推出時,其最大的競爭對手之一Glide,已逐步走向了沒落,而DirectX則得到了大多數廠商的認可。DirectX 6.0中加入了雙線性過濾、三線性過濾等最佳化3D圖像質量的技術,遊戲中的3D技術逐漸走入成熟階段。
DirectX 7.0
DirectX 7.0最大的特色就是支持T&L,中文名稱是“坐標轉換和光源”。3D遊戲中的任何一個物體都有一個坐標,當此物體運動時,它的坐標發生變化,這指的就是坐標轉換;3D遊戲中除了場景+物體還需要燈光,沒有燈光就沒有3D物體的表現,無論是實時3D遊戲還是3D影像渲染,加上燈光的3D渲染是最消耗資源的。雖然OpenGL中已有相關技術,但此前從未在民用級硬體中出現。在T&L問世之前,位置轉換和燈光都需要CPU來計算,CPU速度越快,遊戲表現越流暢。使用了T&L功能後,這兩種效果的計算用顯示卡的GPU來計算,這樣就可以把CPU從繁忙的勞動中解脫出來。換句話說,擁有T&L顯示卡,使用DirectX 7.0,即使沒有高速的CPU,同樣能流暢的跑3D遊戲。
DirectX 8.0
DirectX 8.0的推出引發了一場顯示卡革命,它首次引入了“像素渲染”概念,同時具備像素渲染引擎(Pixel Shader)與頂點渲染引擎(Vertex Shader),反映在特效上就是動態光影效果。同硬體T&L僅僅實現的固定光影轉換相比,VS和PS單元的靈活性更大,它使GPU真正成為了可程式的處理器。這意味著程式設計師可通過它們實現3D場景構建的難度大大降低。通過VS和PS的渲染,可以很容易的寧造出真實的水面動態波紋光影效果。此時DirectX的權威地位終於建成。
DirectX 9.0
2002年底,微軟發布DirectX9.0。DirectX 9中PS單元的渲染精度已達到浮點精度,傳統的硬體T&L單元也被取消。全新的VertexShader(頂點著色引擎)編程將比以前複雜得多,新的VertexShader標準增加了流程控制,更多的常量,每個程式的著色指令增加到了1024條。
PS 2.0具備完全可程式的架構,能對紋理效果即時演算、動態紋理貼圖,還不占用顯存,理論上對材質貼圖的解析度的精度提高無限多;另外PS1.4隻能支持28個硬體指令,同時操作6個材質,而PS2.0卻可以支持160個硬體指令,同時操作16個材質數量,新的高精度浮點數據規格可以使用多重紋理貼圖,可操作的指令數可以任意長,電影級別的顯示效果輕而易舉的實現。
VS 2.0通過增加Vertex程式的靈活性,顯著的提高了老版本(DirectX8)的VS性能,新的控制指令,可以用通用的程式代替以前專用的單獨著色程式,效率提高許多倍;增加循環操作指令,減少工作時間,提高處理效率;擴展著色指令個數,從128個提升到256個。
增加對浮點數據的處理功能,以前只能對整數進行處理,這樣提高渲染精度,使最終處理的色彩格式達到電影級別。突破了以前限制PC圖形圖象質量在數學上的精度障礙,它的每條渲染流水線都升級為128位浮點顏色,讓遊戲程式設計師們更容易更輕鬆的創造出更漂亮的效果,讓程式設計師編程更容易。
DirectX 9.0c
與過去的DirectX 9.0b和Shader Model 2.0相比較,DirectX 9.0c最大的改進,便是引入了對Shader Model 3.0(包括Pixel Shader 3.0 和Vertex Shader 3.0兩個著色語言規範)的全面支持。舉例來說,DirectX 9.0b的Shader Model 2.0所支持的Vertex Shader最大指令數僅為256個,Pixel Shader最大指令數更是只有96個。而在最新的Shader Model 3.0中,Vertex Shader和Pixel Shader的最大指令數都大幅上升至65535個,全新的動態程式流控制、 位移貼圖、多渲染目標(MRT)、次表面散射 SubSurface Scattering、柔和陰影 Soft shadows、環境和地面陰影 Environmental and ground shadows、全局照明 (Global illumination)等新技術特性,使得GeForce 6、GeForce7系列以及Radeon X1000系列立刻為新一代遊戲以及具備無比真實感、幻想般的複雜的數字世界和逼真的角色在影視品質的環境中活動提供強大動力。
因此DirectX 9.0c和Shader Model 3.0標準的推出,可以說是DirectX發展歷程中的重要轉折點。在DirectX 9.0c中,Shader Model 3.0除了取消指令數限制和加入位移貼圖等新特性之外,更多的特性都是在解決遊戲的執行效率和品質上下功夫,Shader Model 3.0誕生之後,人們對待遊戲的態度也開始從過去單純地追求速度,轉變到遊戲畫質和運行速度兩者兼顧。因此Shader Model 3.0對遊戲產業的影響可謂深遠。
DirectX10.0
經過幾年的發展,目前DirectX已經發展到了V9.0版本。DirectX9.0沒有令我們失望,其所帶來的電影級畫面渲染效果給我們造成的震撼絕不亞於當年的Voodoo。但微軟並沒有止步不前。目前DirectX 9.0c的繼任者DirectX 10已經呼之欲出,這種即將隨同微軟Windows Vista作業系統一同面世的DirectX API將再次撼動當今顯示卡市場的格局,因為這又將是一個新時代的開始。下面我們將根據目前各方透露出來的信息來為大家介紹一下DirectX10將為我們帶來什麼樣的最新特性。
1、Shader Model 4.0
相信大家在選購顯示卡時已經都向是否支持DirectX9.0c看齊,而Shader Model 3.0則是DirectX9.0c最大的特色。雖然DirectX9.0c與DirectX9.0b僅僅只是一個字母之差,但DirectX9.0c所支持的SM3.0與DirectX9.0b所支持的SM2.0在功能、特效方面卻有差很大的差別。在而呼之欲出的DirectX10中,Shader Model也將升級到Shader Model4.0,那么SM4.0比SM3.0優勢在哪呢?
SM4.0規格令遊戲程式開發員有更大的空間,相比原先的Shader Model 3.0自然繼續有所提升,特別是對於最大指令數從512條增加到了64000條;暫存器數量也從原先的32個增加到驚人的4096個,而同時Texture由SM3.0的16個提升至128個,並硬體支持RGBE,令HDR不再需要特別的Decoding處理也能實現,HDR+AA將不再有這么多的麻煩。對於2D的紋理尺寸支持來看,DirectX 10也有驚人的提升,8192x8192的最高紋理分辯率比原先最高2048x2048的分辯率要高出許多。早在此前的E3上,微軟就公布部分《飛行模擬X》的DX9/DX10的遊戲畫面對比。從畫面上我們可以看到其水面效果十分的逼真,同時淡化了DirectX 9.0版本比較虛假的山脈在水中的倒影。
值得注意的是,DirectX 10中將不在使用FP16數據,轉而只支持FP32運算,並且也支持32位的紋理格式,可想而知,對於DirectX 10的顯示卡來說,進行完全的FP32運算將可以獲得更精細的畫面。因此在完全DirectX 10的套用中,目前部分NVIDIA的DirectX 9c圖形顯示卡可能會出現不兼容或者運行效率低下的問題。
2、統一渲染架構
相對SM4.0,其實在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,這個情況將會更為明顯。那么,有沒有可能把這兩者整合在一起呢?答案就是肯定的!
而在DirectX 10中引入了統一渲染架,通過一個整合Vertex Shader、 Pixel Shader的可程式整合光影處理器來完成目前Vertex Shader、Pixel Shader所有的工作。所謂統一渲染架構,最容易的理解方式就是Shader單元不再分離,顯示核心不再為Shader類型不同而配置不同類型的Shader單元,對於主流的顯示核心,Pixel Shader單元以及vertex Shader單元的概念都應該已經非常熟悉了,而在統一渲染架構中這兩種Shader單元將不再分離,轉而所有的Shader單元都可以為需要處理的數據進行處理,不管和是Pixel Shader數據還是Vertex Shader數據。而調配哪幾組Shader單元負責處理什麼數據或者進行什麼樣子類型的計算,則由一個被稱為small sets of instructions(SSI)的部分來控制。這樣在硬體上,設計者就無需為不同的著色引擎設計不同的執行單元,只要按照所對應的接口以及操作方式全部融為一體,僅設定一種獨立的Shader執行單元。這意味著GPU廠家可以用更小的核心來實現現在需要用8000萬甚至更多電晶體才能實現的功能!
但由於Vertex和Pxiel Shader在很多焙蚨韻低車男棖罅渴遣煌模綰蔚髖洳煌腟hader單元呢?針對這么問題,在DirectX 10中由一個單元來判定當前需要渲染場景的具體Vertex以及Pixel Shader的計算需求量,而根據這個需求量來分配Shader資源。由於採用統一渲染架構,所有Shader單元既可以處理Pixel Shader數據同時也可以處理Vertex Shader的數據,這樣的資源合理利用率要高於普通的分離式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運算、影像編碼運算等,讓顯示卡的套用範疇大幅提升。
其實ATI早在4年前就開始著手圖形晶片統一渲染架構設計,比如ATI針對Xbox 360設計的Xenos圖形晶片已經採用了Unified-Shader統一著色架構。在PC GPU方面,ATI方面也進行了縝密的安排,以保正旗下圖形晶片平穩向DX10統一著色架構過渡。
比如R5xx當中採用的統一著色化的Ringbus記憶體匯流排,如控制像素單元的多執行緒“ Ultra-Threading Dispatch Processor ”(超執行緒分配處理器)。ATI這種做法將保正在2007年平穩地向R6xx圖形晶片過渡,也就是說R6xx系列圖形芯在採用統一渲染架構的同時,繼續沿用R5xx的顯存匯流排和超執行緒分配處理器,只是在性能上有所改進。
不過,目前NVIDIA方面似乎對統一渲染架構並不感興趣,據之前多方面的訊息表明,NV下一代旗艦G80晶片依然沿用傳統的獨立著色架構,但硬體規格上還是完整支持DX10,這是怎么回事呢?看來微軟DX10似乎默許了G80的這種設計。但無論採用統一渲染架構還是獨立渲染架構,DX10規格的GPU必須支持Shader Model 4.0。
3、Geometry Shader技術
另外,DirectX 10還帶有一個被稱為Geometry Shader的新版“Shader”,可以處理Pixel Shaders和Vertex Shaders不能完成的任務。
目前DirectX的處理模式是:1.頂點數據準備;2.Vertex Shader;3.完成Vertex Shader;4.光柵化計算;5.PixelShader;6.完成PixelShader;這是一個D3D標準的處理模式,這個過程是是順序進行的(DirectX 10之前)。因此,只能吸收和輸出一個單獨頂點的舊版Vertex Shaders是不能創建或者破壞三角形的。
而新的Geometry Shader的作用就是對每個Vertex數據臨近的數據進行Vertex函式處理也就是用來判定臨近的,類似數據操作的點來進行計算,而這種函式處理直接關係到整個渲染模型的形狀;也就是說其可以快速的把模型類似的頂點結合起來進行快速運算,雖然其操作不會象Vertex Shader那樣的進行完整的操作,只是處理器單個頂點的相關函式操作,但是這種操作卻可以確定整個模型的物理形狀,這將大大加速處理器速度,因為其它Shader單元將不再去需要判定數據所存在的位置,而只是需要簡單的為特定區域進行操作就可以了。
不僅如此,在這些數據進入渲染引擎和Pixel Shader處理前,Geometry Shader能夠製造新的原始體,添加新的三角形。Geometry Shader可以把處理數據直接輸入記憶體,免除了先經過CPU處理才進入顯示卡流水線的麻煩,這一改進可以讓GPU直接處理細微的粒狀效果,如煙霧和爆炸效果等(在這之前這一任務通常交由CPU來完成)。玩遊戲時,配合紋理陣列的Geometry Shader還可以製造出通常由六個方位才能創建的立方環境映射,而現在則只需通過一個方位就可以搞定。微軟認為Geometry Shader可以把點、線、三角等多邊形聯繫起來快速處理、同時創造非常漂亮的不規則多邊形,並且可以在很短時間內直接分配給其它Shader單元和顯存進行數據處理,而這一切都已經無需CPU干預了。因此微軟認為,搭載Geometry Shader後,可以方便的實現複雜的煙霧、爆炸、皮毛、毛髮等複雜圖象;甚至可以模擬一些簡單的運動軌跡等;而這些操作很多時候已經不再需要CPU的干預,因此自然可以更好的發揮系統的3D效率。
此外,Geometry Shader中還具備一個被稱為Stream Out的技術,這種技術允許GPU可以重複利用已經計算的結果(允許繼續由Vertex Shader數據來調用處理好的結果),從而減少計算,但是目前還不知道這種模式是如何實現的,畢竟這些已經操作過的數據暫存區會在哪裡,其它計算單元又是如何進行數據請求了,這一切目前仍是個迷。
4、虛擬顯存技術
眾所周知,在286/386時代,人們為了利用更多的記憶體,發明了虛擬定址技術,今天,這項技術被用到顯存身上,將如同當年般震撼,徹底地把顯存的利用帶到了全新的層次。
以往,GPU採用直接記憶體調用法則,無論是紋理、頂點、多邊形、光影,都需要占用顯存空間,這些數據的運算量越大,占據的空間也越多。為了避免每次都需要重新計算,人們想到了MIP-MAP紋理映射的方法。當時,紋理貼圖的尺寸很小、3D場景亦沒有這么複雜,MIP-MAP能夠顯著地減少GPU計算量和顯存的占用。然而,隨著3D遊戲複雜性的增加,僅靠顯存已經無法存儲這些數據,不得不開發出AGP匯流排,利用部分記憶體作為AGP顯存,來暫時存儲紋理和頂點數據、補充顯存容量的不足。但別說以前的AGP 8X,即使是今天頻寬更大的PCI Express 16X,亦遠遠不能與顯存頻寬相比。更為嚴重的問題是,為了同步處理,GPU會降低顯存的工作速度,使之與顯示卡顯存順利傳輸,所以一旦動用顯存,系統速度會大為下降。從這方面看,在遊戲中提升紋理調節的時候,必須注意自己的顯存容量,比如你要玩Farcry、戰地1942、等遊戲,沒有256MB顯存,就別想把畫質設定到最高,否則會大大地影響遊戲速度。
因此,微軟根據虛擬記憶體管理方法將在DirectX 10中引入虛擬顯存技術。虛擬顯存將可以很好的解決以上所提到的問題,所有的紋理、著色等都分成“小塊”數據即使在低速匯流排上也能流暢傳輸。例如,一個4KB大小的頁面相當於一個32×32×32bit大小的紋理貼圖,這樣大小的紋理貼圖已經可以滿足需要,這樣在需要紋理渲染時系統就不需要傳輸太多"頁面"就可以完成相應的工作。而做到這一切幾乎不會損失性能。
而且將虛擬顯存技術與著色引擎搭配也是一個很具創新性的想法。在顯存中,著色器指令是被當作一個抽象的數據塊進行處理的,系統並不理會“數據塊”能否裝得進GPU的指令流水線,一旦著色器被載入,它就會在每個頂點以及象素上操作、直至卸載。因此要想完成更長的著色器指令就需要增加GPU的指令執行管數或利用自動多路形式將指令劃分成若干個可管理的小塊。由於GPU的指令執行管數在設計之時就固定好,如果要增加執行管數無疑需要重新設計及增加電晶體數,顯然第一種方法並不太實用。因此第二種方法較為實用,而這也與我們所提到的虛擬顯存系統實際是一樣的。為了適應著色器指令的執行套用,虛擬顯存被劃分為許多相對獨立的頁面。假定圖形處理單元當中設定的指令執行管道可以執行整個頁面所包含的指令,那么我們的著色器操作就可以建立起一套流水線式的運作機制,載入一個頁面,然後運行,停止下來之後再載入一個新的頁面,然後運行,如此反覆指導全部包含指令的頁面被載入到處理器當中,此間,執行管道的作用與處理器的L1 Cache相當類似,而整個運作流程和處理器的可以說是一致的。
通過虛擬顯存技術,著色指令的長度將可以不受指令執行管數的限制,存儲系統可以存放的圖象紋理可以更多,定址的方式變得輕鬆簡單,於是我們的DirectX10技術就實現了可用資源“不受限制”的強大功能。當然了,資源的“不受限制”還是受到硬體實際可用資源的限制。指令太長的話,GPU就需要多次載入指令頁面,這樣也會造成性能大幅度下降;如果紋理數據太多,需要用到系統記憶體、甚至是硬碟空間進行存儲的話,那么整個圖形子系統的性能也會下降。針對這個問題,微軟為資源限制定了兩個門限:只要不超過第一個限定,系統都能夠工作;而超過第二個限定時,系統就不能夠正常工作(在640×480解析度下,fps值不足10)。其實,此前已經有廠商使用了虛擬顯存技術,3Dlab的專業級顯示卡野貓WildCat VP就能調度16GB虛擬顯存,16GB喔,在主流顯存不過256MB的時代,這是多么震奮人心的事情。很明顯當你能完全使用全部16GB時,相信系統瓶頸問題已經不在此。
5、整數指令集
除了統一渲染架構和虛擬顯存,DX10還有不少改進之處,其中最重要的莫過於整數指令集。也許你會覺得奇怪,整數指令集不是所有計算的基礎嗎?對於CPU而言,這是沒錯的,但別忘記了,當然為何引入浮點處理器和多媒體指令集,原因是圖形運算需要大量的浮點指令。浮點是不精確數據類型,當尋值數據與紋理數據不符合的時候,可以採用近似值和多個數據計算的內插值來代替,對圖形最終畫面沒有影響,此類速度也比整數要快。因此,GPU的基礎恰好與CPU相反,是以浮點指令為主的。目前,著色器所處理的所有東西都需要依靠浮點運算所完成(除了靜態分支預測試運算之外)。
在大多數的圖像處理上來說,這種處理方式是沒有問題的。但進行動態分支預測或非內插式記憶體搜尋時(比如對頂點快取器進行定位索引時),這種浮點運算處理方式就存在很大的問題。而DX10中引入整數運算將有許多好處,比如進行動態/靜態分支預測、頂點快取定位、通用記憶體定址方面,浮點是無法進行精確計算的。
6、直接存取像素著色幀快取
現在的渲染模式,主要是實時渲染,每種渲染工作都是實時完成的,中間無法打斷,如果我們想為圖像增加數字分級、色彩校正或顏色調節等工作,只能重新進行一次計算,對整體工作造成了延時。事實上,當你讀取渲染中圖象的紋理數據,大多數的GPU和驅動程式都可以工作。但這屬於非法操作(沒有經過定義),這樣的操作隨時可能被中斷,而開發人員通常不會使用這項功能。
DX9時代的解決方案有二,第一種是使用兩個獨立的紋理,一個紋理用於正常工作,另一個備用紋理應付那些附加的計算,此方案的最大問題是必須占用兩倍顯存空間;第二種是在Pixel Shader中通過模擬混合函式的實現以上功能。ATi已經在他們的GPU晶片中加入了類似的做法,他們通過頂點著色引擎來模擬原有的固定頂點處理函式。這樣就意味著GPU設計廠商需要在著色引擎上增加額外的電晶體來實現以上的功能。
DX10則轉向了新思路:使用了像素描影器直接存取幀快取的方式來部分代替以前的實時渲染,某些情況下,我們可以隨時中斷渲染,加入我們想要的效果,再繼續運算,不對整個渲染過程造成影響,使渲染變得更為靈活和可控。但並不意味著在DirectX10中進行實時渲染模式就毫無問題,並且廠商可能放棄了對這種技術的支持。那樣這項技術很可能以一種備選方案出現,如此一來,程式設計師可能會忽略這項技術的存在而繼續沿用老方法
7、增強型圖形鑲嵌技術
在DX8時代,為了提高曲線畫面的真實度,顯示卡廠商增引入了高階曲面技術,如:nVidia的RT-Patch和ATi的N-Patch。從本質上看,它們把曲線處理帶入了一種新紀元,看看現有的真實世界,並不總是以方方正正的多邊形存在的,很多地方都由曲面來構建,才使真實的物體種類更為多樣,很難想像我們有一個四方頭的時候是怎樣的恐怖。然而,每次的技術進化總是有一定阻礙,高階曲面在當時未能完善,甚至導致了畫面產生變形。因此不少開發商都這種技術失去了興趣,而圖形晶片廠商最終也放棄對這項技術的硬體支持。直到DirectX 9引入適應圖形鑲嵌以及置換貼圖技術,這兩項技術再次被人們所關注。高階曲面鑲嵌以及置換貼圖這兩項技術雖然在NVIDIA的GF6*/7*系列、ATI的X1000系列圖形晶片中得到支持,但當前DirectX技術在支持高階曲面上仍存在一定問題。
雖然高階曲面未能正式流行,而為它的自適應圖形鑲嵌和置換貼圖兩項獨特的技術卻引起了人們的興趣。自適應圖形鑲嵌可以按照我們的要求,進行不同的紋理鑲嵌,以便取得更佳的視覺效果,將使3D世界進一步擬真化,可是,它們遇到的最大問題,依然是高階曲面的運算,如何使用最小的運算又不導致畫面破損和變形,是DX10極須解決的問題。DX10的硬體將支持各種通用高階曲面計算:Catmull-Rom曲面、貝賽爾曲線、B-Splines曲線、圓錐曲線,證明高階曲面回歸的時代已經到來,只是要我們去認真地進行最佳化而己。當然這些也需要圖形晶片進行硬體支持。
8、Physics(物理加速)技術
最近熱門的技術就是物理加速及其套用,物理計算是下一代遊戲體驗當中的關鍵部分,它將增加遊戲的真實感、沉浸感和帶來更加有趣的體驗。微軟同樣對物理加速非常感興趣,在未來的DX10版本中會加入物理加速的支持。
雖然,物理加速的概念很早之前就已經提出,但時至今日依然處於概念性階段——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和ATI的GPU也可以動態的處理物理運算!
但令人遺憾的是,DX10最初版本將不支持物理加速功能,微軟表示將在下一個DX10改進版(DX10.0b?)才會考慮引入此功能。
除以上幾大改進之外,DirectX 10將不再採用“capabilities bit”的設計,也就是在驅動中定義一些“bit”來告訴系統這塊顯示卡支持和不支持那些DirectX特效。
二、OpenGL
OpenGL是個專業的3D程式接口,是一個功能強大,調用方便的底層3D圖形庫。OpenGL的前身是SGI公司為其圖形工作站開發的IRIS GL。IRIS GL是一個工業標準的3D圖形軟體接口,功能雖然強大但是移植性不好,於是SGI公司便在IRIS GL的基礎上開發了OpenGL。OpenGL的英文全稱是“Open Graphics Library”,顧名思義,OpenGL便是“開放的圖形程式接口”。雖然DirectX在家用市場全面領先,但在專業高端繪圖領域,OpenGL是不能被取代的主角。
OpenGL是個與.硬體無關的軟體接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之間進行移植。因此,支持OpenGL的軟體具有很好的移植性,可以獲得非常廣泛的套用。由於OpenGL是3D圖形的底層圖形庫,沒有提供幾何實體圖元,不能直接用以描述場景。但是,通過一些轉換程式,可以很方便地將AutoCAD、3DS等3D圖形設計軟體製作的DFX和3DS模型檔案轉換成OpenGL的頂點數組。
在OpenGL的基礎上還有Open Inventor、Cosmo3D、Optimizer等多種高級圖形庫,適應不同套用。其中,Open Inventor套用最為廣泛。該軟體是基於OpenGL面向對象的工具包,提供創建互動式3D圖形應用程式的對象和方法,提供了預定義的對象和用於互動的事件處理模組,創建和編輯3D場景的高級應用程式單元,有列印對象和用其它圖形格式交換數據的能力。
OpenGL的發展一直處於一種較為遲緩的態勢,每次版本的提高新增的技術很少,大多只是對其中部分做出修改和完善。1992年7月,SGI公司發布了OpenGL的1.0版本,隨後又與微軟公司共同開發了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運行的大型3D圖形處理軟體也可以在微機上運用。1995年OpenGL的1.1版本面市,該版本比1.0的性能有許多提高,並加入了一些新的功能。其中包括改進印表機支持,在增強元檔案中包含OpenGL的調用,頂點數組的新特性,提高頂點位置、法線、顏色、色彩指數、紋理坐標、多邊形邊緣標識的傳輸速度,引入了新的紋理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,該語言是“OpenGL 2.0”的底核,用於著色對象、頂點著色以及片斷著色技術的擴展功能。
OpenGL 2.0標準的主要制訂者並非原來的SGI,而是逐漸在ARB中占據主動地位的3Dlabs。2.0版本首先要做的是與舊版本之間的完整兼容性,同時在頂點與像素及記憶體管理上與DirectX共同合作以維持均勢。OpenGL 2.0將由OpenGL 1.3的現有功能加上與之完全兼容的新功能所組成(如圖一)。藉此可以對在ARB停滯不前時代各家推出的各種糾纏不清的擴展指令集做一次徹底的精簡。此外,硬體可程式能力的實現也提供了一個更好的方法以整合現有的擴展指令。
目前,隨著DirectX的不斷發展和完善,OpenGL的優勢逐漸喪失,至今雖然已有3Dlabs提倡開發的2.0版本面世,在其中加入了很多類似於DirectX中可程式單元的設計,但廠商的用戶的認知程度並不高,未來的OpenGL發展前景迷茫。