【西川善司】GPU和Shader技術的基礎知識(全8回)

本文取自西川善司的3D圖形技術連載,全99回

本貼為1~8回,爭取每1~2天更新一回吧。半年更新完。

也希望大家能支持。

翻譯 Trace

校對&註解 千里馬肝

本連載的主要目的,是介紹最新的PC和GAME所使用的最新3D圖形技術的發展趨勢。

暫時的方針是,首先是考慮介紹比較新的PC Game和PS3,XBOX360等新時代遊戲機的遊戲所採用的技術。

那麼首先,想回顧一下近年來的3D圖形技術的進化歷史。

實時3D圖形技術的進化歷史

目前,不僅索尼的PS3,微軟的Xbox360,任天堂的Wii這些最新的遊戲機,以及最新的微軟Windows Vista的用戶界面變成了3D圖形,就連NDS和PSP等掌機,以及一部分最新的移動電話也支持了3D圖形技術。

說來,實時3D圖形是怎麼進化著,並向未來發展的呢?今後,要長期和實時3D圖形打交道的人,先試著整理基礎知識吧。

1980年代後半到90年代前半,Flat Shading 到 Texture Mapping的時代。

在這之前3D遊戲還沒有應用, 基本上[3D圖形]是用在技術訓練的模擬,解釋自然現象或光學現象的學術研究,比如說對影像表現的應用等,在專業用途和學術用途的領域裡進化著。從1980年代後期開始到1990年代,大型遊戲製造廠商在街機用途的遊戲系統裡採用了實時的3D圖形系統。從這開始3D圖形才真正在遊戲裡被有效的利用。

要說這個時代具有代表性的作品就是NAMCO(南夢宮)的「winning run」(1988年)、SEGA(世嘉)的[Virtual Fighter(VR戰士)」(1992年)。那時候雖然也使用多邊形模型來實時表現,但多邊形數很少,採用的lighting也是以多邊形為單位的Flat Shading為主流。

但是,遊戲和3D圖形的相遇,確立了[實時3D圖形]這個領域,並一直支援著它的進化。

在NAMCO的[RIDGE RACER(山脊賽車)](1993年)裡, 應用Texture Mapping 的3D模型(在多邊形上貼上貼圖)可以自由運動,就好像是從積木集合體那樣的3D圖形開始,一下提高了真實性。

【西川善司】GPU和Shader技術的基礎知識(全8回)

[Virtual Fighter(VR戰士)」(1993年)。只是以多邊形單位lighting為基本的[Flat Shading],也沒有Texture Mapping這個概念,因此,臉和服裝都使用”某種形狀的多邊形”來繪製(C)SEGA。

1990年代中期~家用遊戲機開闢了面向消費者的實時3D圖形。

當時,除了特殊的圖形工作站,如果限定在[遊戲平臺],那麼當時3D圖形技術最先進的是街機遊戲系統。然而,1994年發生歷史性的逆轉,那就是SONY PlayStation(PS1)和 SEGA Saturn的登場。

儘管分辨率不是太高,但提供給消費者對應Texture mapping的實時3D圖形的意義很大。在這些主機上,實時3D圖形和3D遊戲圖形以並行的關係性,開始急速的進化。

另一方面,很遺憾,這時適合普通消費者的PC的3D圖形技術,要比遊戲機大幅度落後。適合普通消費者的PC 3D圖形技術真正的普及,是在1995年登場的新操作系統,Windows95的時代之後。

微軟發表了把Windows環境下的Sound,Graphic,network,Game co**oller等多媒體API組件整合到一起的「DirectX」,Windows 95也採用了它。DirectX後面增加版本號的稱呼也成為慣例、Windows環境下真正的3D顯卡開始普及。實時3D圖形可以使用是在1997年發表的[DirectX 5]之後。

也正是這個時候,大型的CPU/Chipset製造廠商Intel的新圖形端口AGP(Accelerated Graphics Port)總線技術也投入實用化。強大的圖形芯片製造廠商NVIDIA推出了RIVA 128系列,ATI(2006年和AMD合併)推出了RAGE 3D系列。都深受歡迎。比PS1登場晚了3年,PC平臺終於有了可以和PS1同程度的實時3D圖形。

【西川善司】GPU和Shader技術的基礎知識(全8回)

NVIDIA的「RIVA 128」

【西川善司】GPU和Shader技術的基礎知識(全8回)

DirectX 5時代、「用PC玩3D遊戲」並廣為傳播的「Quake II」(1997年、id software)

(C)1997 id Software,Inc.All Rights Reserved。

【西川善司】GPU和Shader技術的基礎知識(全8回)

DirectX 6時代,以顯卡的經典遊戲而聞名的「Incoming」(1998年、Rage社) (C)Rage Games Ltd 1998。

1990年代後期~ DirectX的急速進化歷史

1990年代後期,由於PC業界團結一致的致力於強化PC,使圖形實現了急劇的進化

1998年,發表了整合了當時已經發表的各種實時3D圖形功能的DirectX6,次年1999年,決定了今後PC圖形進化方向性的DirectX 7也被髮表了。

直到DirectX 6以前,3D圖形處理硬件,只擔當多邊形和相應的像素的計算(光柵化rasterise處理),和處理貼上材質紋理等像素單位的處理。

DirectX 7中,實現了把之前CPU擔當的頂點單位(多邊形單位)的座標變換處理和光照處理,改由3D圖形硬件來擔當的結構。特別是在那時,把用圖形 “硬件” 進行“頂點單位的座標變換(Transform)和光照處理(Lighting)”的結構,稱作[Hardware T&L] (T: Transform L: Lighting)

還有,因為這個契機,PC業界理解到[擔當全部圖形處理的處理器]的含義,開始把這樣的硬件(處理器)稱為GPU(Graphics Processing Unit),以後也就這麼定下來了。另外不得不說句閒話,GPU的這個稱呼,發音和文字上都和CPU(Ce**al Processing Unit)對應著。作為對應DirectX 7的GPU,NVIDIA的GeForce 256和ATI的第一代RADEON登場了。

【西川善司】GPU和Shader技術的基礎知識(全8回)

搭載了「NVIDIA GeForce 256」的顯卡

實時3D圖形技術上,雖然這之前感覺遊戲機一方走在更前面一些,但是從進入DirectX 7時**始,形勢完全被PC逆轉了。這是因為,家用遊戲機都被普及性優先的戰略所制約,只能以5年為一個週期變更硬件配置,相對的,PC每年都可以吸收最新技術完成進化。還有,當時遊戲機的份額之爭是在3個製作商之間爭鬥,相對,PC圖形因為是在近10個製造商之間爭奪,所以也對激烈競爭的根源起了不小的影響吧,但是,直到進入了DirectX 8時代,大淘汰的浪潮終於湧了過來,GPU製造廠商也縮小到數家。

【西川善司】GPU和Shader技術的基礎知識(全8回)

「GIANTS:CITIZEN KABUTO」(2000年、PLANET MOON STUDIOS)。在DirectX 7時代,PC的實時3D圖形的表現力完全凌駕於家用遊戲機之上。

(C)2000 Planet Moon Studios. All Rights Reserved. Planet Moon and the Planet Moon logo are trademarks of Planet Moon Studios. Giants, Giants: Citizen Kabuto, Interplay, the Interplay logo, and "By Gamers. For Gamers." are trademarks of Interplay Entertainment Corp. All Rights Reserved. Exclusively licensed and distributed by Interplay Entertainment Corp. All other copyrights and trademarks are the property of their respective owners.

2000年 Programmable Shader Architecture(可編程著色器架構)展開帷幕。進入GPU製造商淘汰的DirectX 8時代。

雖然在1998年世嘉•Dreamcast,2000年受到期待的索尼•layStation2開始發售,但是在3D圖形的處理能力上,它們和當時的PC圖形保持在同等程度。

【西川善司】GPU和Shader技術的基礎知識(全8回)

確實,雖然PC DirextX一方有著先進性,但硬件(GPU)的急劇進化並不能牽引軟件業界,

PC一方變得難以技術同步。

雖然那麼說,但作為PC業界,不管怎樣都維持了每年一定會積極採用全世界研究者們創新出來的最新3D圖形技術的基本方針。說到原因,對最新技術牽引的PC業界來說,導入像家用遊戲機那樣的緩慢的進化循環是很難的。PC一方每次在新GPU上搭載新機能, DirectX就要為了可以利用這個機能新添加的API,這使DirectX不斷的增長。

此外,實現的新功能在實際應用裡使用是沒有限制的,這樣的功能作為DirectX內的化石功能持續殘留著。GPU則也要為了這些化石功能消費晶體管,不合理的成本和電力消耗是沒有意義的。

就在這時,設法把圖形處理用軟件方式實現,並導入到GPU裡的想法被提出了,從而有了加入[shader可以編程實現]這個含義的,[可編程著色器](Programmable Shader)的概念(待續)

【西川善司】GPU和Shader技術的基礎知識(全8回)

世界第一個面向消費者的採用可編程Shader架構的GPU「GeForce 3」

【西川善司】GPU和Shader技術的基礎知識(全8回)

GeForce 3的人臉動畫DEMO,利用可編程著色器實現的基於法線貼圖的凹凸貼圖表現,對衣服的外形和人肌膚的褶皺也一樣適用。

那麼,在上次最後介紹的是可編程著色器架構(Programmable Shader Architecture),最早支持它的DirectX是2000年末發表的DirectX 8。

作為對應DirectX 8的GPU,NVIDIA GeForce 3,ATI Radeon 8500等被投入市場。還有,2001年微軟推出的Windows XP,也集成了DirectX 8。

可編程Shader有擔當頂點處理/多邊形處理的[可編程頂點著色器]( Programmable Vertex Shader),和處理像素單位的陰影和處理相關紋理的[可編程像素著色器] (Programmable Pixel Shader)兩種類型,在各自的著色器單元(Shader Unit)上,有著把各種各樣的Shader程序來實現為3D圖形的處理的結構。而且,作為用語,如果直接說[Programmable Shader],有指雙方(VS和PS)的情況,或者是指這個整體的概念。

並且,由於這個Shader程序是軟件,開發者可以自己製作獨創的Shader程序,就可以在GPU上實現新的圖形功能。

這樣,即使不等待每年發表的最新3D圖形技術和下一代GPU登場,如果開發了實現這個技術的Shader程序(除了性能上有差別),那麼也會產生從實驗或實踐中獲益。這個技術傳播後,也產生了硬件和軟件業界就為再次互相靠近的契機。

但是,可編程Shader架構的實現,要求GPU製造廠商有很高的技術能力,在接下來DirectX 9登場的時候,支撐了初期實時3D圖形的GPU廠商的撤退變得很顯眼,淘汰的結果,2001年以後,GPU製造廠商的兩大巨頭NVIDIA和ATI激烈的GPU戰爭變得突出。

現在,除了兩個公司以外還在開發對應PC消費者的量產GPU的還有英特爾(但集成到芯片組裡)和S3公司。支撐PC圖形黎明期的3dfx公司,2000年被NVIDIA收購,類似的Number Nine公司也在1999年倒閉了。Windows 9x時代,在日本有著極大人氣的MATROX公司,雖然也最後投入了DirectX 8代GPU「Parhelia」系列,但並不成功,此後就遠離了對應最新技術的GPU開發。面向專業工作站用GPU的3Dlabs公司在Windows 9x時代雖然也投入了對應消費者的GPU,但也是徒勞,2002年被Creative公司收購,2006年宣佈退出專業用GPU業務。從芯片組製造廠商SiS派生出的GPU專門製作廠,新成立了XGI公司,2006年,在對應最新技術的新GPU開發方面,事實上也是退出了。

【千里馬肝注:以本人的經歷舉例,XGI上海研發部先是被ATI收購,不久後ATI又被AMD收購。】

對了,在DirectX 8發表約1年後的2001年末。微軟發售了以DirectX 8為基礎的遊戲機,第一代「Xbox」。這裡就不做過多討論了,不過,Xbox是世界上首個採用可編程Shader架構的家用遊戲機。

【西川善司】GPU和Shader技術的基礎知識(全8回)

第一代「Xbox」。搭載了以GeForce 3為基礎的GPU,API使用DirectX。

【西川善司】GPU和Shader技術的基礎知識(全8回)

Xbox和PC兩方發售的「分裂細胞(Splinter Cell)」(育碧 UBI SOFT),讓世界瞭解了基於可編程Shader的3D圖形的可能性。

2002年/2003年~ Shader Modle 2.0和第一期DirectX 9時代

DirectX 8時代的programmable shader(可編程著色器),因為每個GPU製造廠商有若干個分支版本混合在一起的關係,所以被規定為SM1.x。然後到了2002年,新的可編程shader,支持2.0規格的DirectX9發表了。

可編程 shader的規格,用Shader Model(簡稱SM)的關鍵詞後面加版本號來指出架構的方式,近年來變得常態化。總之,例如DirectX 9時代應該就是指「SM2.0」對應GPU興起的時代。

SM2.0可以執行比SM1.x更長的Shader程序,命令種類的增加,能使用的命令組合的限制也被降低了。還有,以前只有Vertex Shader可以使用的浮點運算精度,現在Pixel Shader上也可以使用了,Pixel Shader的陰影處理的計算精度和能夠表現的動態範圍也擴展了。這個擴展決定了未來被稱為[高動態範圍渲染] (High Dynamic Range Rendering:HDR Rendering)的產生,成為實時3D圖形新趨勢的契機。

DirectX 7/硬件的T&L (T:Transform,Lighting)的第一代GPU,並且對應DirectX最初的可編程Shader的GPU都是從NVIDIA發佈的顯卡。相對的,DirectX 9/SM2.0對應的GPU的最初顯卡是ATI發佈的Radeon 9700,都是讓人感慨很深的事情。雖然NVIDIA也投入了與之對抗的GeForce FX,但製造上有問題,性能上也不利,SM2.0時代在ATI的優勢中過去了。

【西川善司】GPU和Shader技術的基礎知識(全8回)

【西川善司】GPU和Shader技術的基礎知識(全8回)

首款對應SM2.0的GPU,ATI發佈的Radeon 9700系列,後面的9800,低端的9600/9500系列也受到了歡迎。

SM2.0時代ATI的優勢被確定,這時最被盼望登場的VALVE公司的大型遊戲[半條命2(Half life 2)],也是以ATI的Radeon 9500/9600/9700/9800系列作為最合適的GPU,展開了銷售戰略。

【西川善司】GPU和Shader技術的基礎知識(全8回)

[Half Life 2] (VALVE)最初是預定在2003年發售,幾次延期後,在2004年末被推出了,雖說有好有壞,HL2為SM2.0時代GPU的構築做出了貢獻。

(C)2004 Valve Corporation. All rights reserved. Valve, the Valve logo, Half-Life, the Half-Life logo, the Lambda logo, Counter-Strike, the Counter-Strike logo, Source, and the Source logo are trademarks or registered trademarks of Valve Corporation in the United States and/or other countries. All other trademarks are property of their respective owners.

2004/2005/2006年~ Shader Modle3.0和第二期 DirectX 9時代

SM2.0雖然說是"2.0",但和1.x時一樣,產生了幾個小型的分支。NVIDIA在GeForce FX

裡組裝了起名為可編程Vertex Shader2.0a(VS2.0a)和可編程Pixel Shader 2.0a(PS2.0a)。

DirectX 9登場約2年之後的2004年,微軟並沒有發表DirectX 10,而是發佈了新的DirectX 9的小幅升級版(minor version up),完成了Shader Model3.0,即SM3.0的對應。

SM版本提高了1.0,但DirectX版本沒有提高的原因有[為了配合即將推出的Windows Vista一起推出],[考慮到之後出現的ATI製造的GPU沒對應SM3.0」等多種說法,但具體不明。

【千里馬肝注:ATI和NVIDIA有著不同的公司風格:ATI從來不搞自己的一套,專心跟著Microsoft的標準走,老大說一決不說二;而NVIDIA一直都喜歡推出自己的標準,不論是SM中VS和PS的版本、OpenGL的EXT、以及Cg和CUDA等,應該說是一個很有活力和野心的公司,在推進技術的同時,也給行業帶來了某種程度上的混亂。】

實際上,SM3.0裡Shader程序的程序長度限制被取消,Vertex Shader、Pixel Shader雙方的指令集也被擴充。SM2.0裡動態條件分支和循環雖然只限在VS裡,但在SM3.0中,PS裡也可以支持了。實際上,可編程Shader的VS和PS的差距沒有了。還有,從Vertex Shader還支持了可以訪問Texture(紋理)的新技術「Vertex Texture Fetching: VTF」(別名 Texture link),在那時深受歡迎。

首款對應SM3.0的GPU,是NVIDIA發佈的GeForce 6800系列,意外的是,ATI在2004年新登場的GPU、Radeon X800系列,還是選擇停留在只對應SM2.0。

【西川善司】GPU和Shader技術的基礎知識(全8回)

NVIDIA的GeForce 6800系列。首款對應SM3.0的GPU,再次從NVIDIA那邊登場了。

Radeon X800系列,是對應Vertex Shader 2.0a和像Piexl Shader2.0b擴展改良的SM2.0的GPU。2004年是兩大巨頭步調不一致,用戶混亂的一年。在把SM2.0稱為“2.0” 的同時,因為ATI和NVIDIA都獨自擴張,也出現了細節版本號的不一致。

2004年也是新的總線端口,「PCI-Express」被開始使用的一年。顯卡的總線迎來從AGP到PCI-Express x16總線的轉移期。2004年~2005年,當用戶要購買新圖形卡或替換,在選擇「是SM2.0(ATI),還是SM3.0(NVIDIA)」的同時,還要做[是AGP還是PCI-Express]這個糾結的抉擇。

那麼,NVIDIA在第2年的2005年投入了第二代的SM3.0對應GPU「GeForce 7800」系列。作為一貫主張「2004年應該貫穿在SM2.0的成熟」的ATI,在2005年,比NVIDIA晚了1年半的時候,投入了自己首款對應SM3.0的GPU「Radeon X1800」系列。但是Radeon X1800雖然支持SM3.0的基本特性,但卻沒有對應VTF。

接著,2006年NVIDIA發表第三代的對應SM3.0的GPU「GeForce 7900」系列,與之對抗的是ATI的Radeon X1900系列的投入。兩個公司,雖然都是在前一代型號上"+100"來定位下一個性能提高的產品,除了性能方面以外也可以吸引眼球。再者,ATI Radeon X1900系列也結束了沒有VTF的狀況。

雖然兩大巨頭GPU廠商ATI、NVIDA都已經推出對應SM3.0的GPU是一件好事,不過關於VTF的支持,兩個公司的步調不一致。使得SM3.0的VTF成為了次要的功能,是否支持這樣的主要功能,對用戶和實時3D圖形技術的進化給予了不小的影響,這成為迎接即將到來的DirectX 10時代的一個大問題。(待續)

【西川善司】GPU和Shader技術的基礎知識(全8回)

SM3.0中,作為特殊功能而大受歡迎的[VTF]。但是,因為ATI沒有支持VTF,VTF的效果只能在這個NVIDIA的Sample Demo裡看到。

在家用遊戲機的世界,2005年末微軟推出作為該公司的第二代遊戲機「Xbox 360」。圖形技術方面對應DirectX 9/SM3.0,接下來將詳細描述其具體性能,值得注意的是Xbox 360 GPU(Xenos)有著世界首個採用統一著色器(Unified Shader)架構的特徵。Xbox 360 GPU是由ATI製造的,意外的是,和同時期ATI對應PC發表的Radeon X1800系列設計完全不同,這一點很有趣。之前推出的Radeon X1x00系列全部都沒有對應VTF,不過,Xbox 360 GPU對應了。

【西川善司】GPU和Shader技術的基礎知識(全8回)

微軟「Xbox 360」。

【西川善司】GPU和Shader技術的基礎知識(全8回)

Xbox 360的遊戲軟件「Gears of War」(2006年,Microsoft)。實時3D遊戲圖形就此到來了。

Gears of War and the Crimson Omen are either registered trademarks or trademarks of Epic Games,Inc. in the United States and/or other countries. All rights reserved. (C)2007 Microsoft Corporation. All Rights reserved. Microsoft,the Microsoft Game Studios logo,Xbox,Xbox360,the Xbox logos,Xbox Live and the Xbox Live Logo are either registered trademarks or trademarks of Microsoft Corporation in the United States and /or other countries.

【千里馬肝注:關於Unified Shader,下圖可以作為一個很好的說明。如果把Unified Shader翻譯成“統一架構”的話,那麼早期的就應該叫做“分離架構”。新架構的好處就是不會出現之前的vs很忙ps很閒,或者ps很忙vs很閒,能夠最大限度的發揮所有著色器的能力,以相同著色器數量規模實現更高的性能。】

【西川善司】GPU和Shader技術的基礎知識(全8回)

2006年末,索尼那邊的新遊戲機「PlayStation3」(PS3)被推出了。PS3的GPU由NVIDIA擔任設計(索尼負責製造),雖然給予了「RSX」的專用名稱,但基本設計是與GeForce 7800系列大體上相同,在圖形技術上是和競爭的Xbox 360一樣對應同世代的DirectX 9/SM3.0。

【西川善司】GPU和Shader技術的基礎知識(全8回)

索尼「PlayStation3」。

【西川善司】GPU和Shader技術的基礎知識(全8回)

「摩托風暴(MotorStorm)」(SCE Europe)。不單是圖形的表現,加上高度真實的物理模擬的特性,使其成為被大受期待的PS3遊戲。

MotorStorm TM (C)2006 Sony Computer Entertainment Europe. Published by Sony Computer Entertainment Inc. Developed by Evolution Studios. MotorStorm is a trademark of Sony Computer Entertainment Europe. All rights reserved.

新世代的遊戲機戰爭應該稱為「Xbox 360對PS3」之間的競爭,實際上,雖然表面若無其事,但這裡「ATI對NVIDIA」也展開了戰鬥。無論如何,二大最新遊戲機的圖形一同成為可編程Shader 3.0的架構。PC和遊戲機都進入了SM3.0的時代。

另外,遊戲平臺的另一個強者,任天堂投入了新世代遊戲機「wii」,不過圖形技術上採用了並沒有太多進化的方針。

【千里馬肝注:需要注意的是,三臺主機的發售時間分別為Xbox360是2005年11月,PS3是2006年11月,Wii是2006年11月(比PS3晚幾天)。所以論GPU硬件而言,Xbox360的C1/Xenos是基於ATI的R500修改的,同時期的ATI X1800是R520核心,而Wii的Hollywood性能與ATI X1300差不多(RV515核心,RV是低端產品的前綴,通常是R的閹割版)。相比同時代的顯卡,Wii圖形不論是顯存上、技術上、分辨率上都要差一大截。作為發售比Xbox360晚一年卻選擇了更低端的產品,顯示出Nintendo開闢一片藍海的決心,結果也如預期一樣,Wii的銷售量一度等於XBox360和PS3的和。】

2007年 Programmable Shader4.0和DirectX 10的時代開始。

1年後,DirectX的版本號更新和1990年代後期有差異,DirectX 9從2002年開始的4年時間,大概佔據了Windows XP的全部生命週期。2006年後期發生了ATI被CPU製造廠商AMD收購的事件,不過如果回顧一下的話,2000年以後的實時3D圖形歷史,實際上可以說是「ATI對NVIDIA」的戰鬥歷史。

2007年初的時候,微軟早早的發表了新的操作系統「Windows Vista」。與這個同步,作為新版DirectX的「DirectX 10」被前後大約耽擱了5年後也發佈了。

在SM4.0中,和SM3.0相比,擴充了新的指令集,具體的有追加了整數運算指令,和二進制位運算指令,因此像CPU那樣通用程序的功能也被強化了。還有,指令集對應頂點著色器和像素著色器的差異沒有了,微軟把這個稱為通用著色器(common shader)架構。

【西川善司】GPU和Shader技術的基礎知識(全8回)

SM3.0和SM4.0的比較。

同時Texture(紋理)的訪問數量,從SM3.0的16個擴大為SM4.0的128個,擁有共享指數E的新的Texture格式RGBE也被支持了。對應實時遊戲的低負荷HDR渲染成為可能。

並且在DirectX 10/SM4.0中,最大的改變是第三個可編程Shader[Geometry Shader]的加入。

因為直到現在,把頂點相關的事務稱為「geometry」的很多,很多人也認為[Geometry Shader]和[Vertex Shader]是一個意思,實際上是和Vertex Shader不同的,但是在[處理頂點相關信息]這點上和Vertex Shader一樣。

Geometry Shader功能是可編程的增減頂點,正確把線段,多邊形,粒子等圖元(Primitive)進行增減。

【千里馬肝注:以本人的經驗,Geometry Shader因為加入時間的關係,在早期的顯卡中,可能是硬件上的原因,其實是由display driver來實現的,意思也就是software方式即CPU的處理,而不是在GPU管線上實際意義的hardware方式實現,所以其效率非常低下。不過,貌似直到現在為止,Geometry Shader的效率一直都沒有得到什麼根本上的改善。】

並且,用作呼應在頂點處理階段增加Geometry Shader處理的形態,也新增了把Vertex Shader 或 Geometry Shader 的輸出在顯存上的功能,寫回輸出功能Stream Output的結構。依靠這個功能,在頂點階段類似的[Vertex Shader->Geometry Shader->Vertex Shader]的重複處理成為可能。

讓Geometry Shader和Stream Output的組合,使得高細節3D模型的變形加工無保留的成為可能。使用GPU做CPU那樣的通用處理為目的的GPGPU(General Purpose GPU)的用途也很有價值。期待這個廣泛的應用。

【西川善司】GPU和Shader技術的基礎知識(全8回)

DirectX 9/SM3.0的渲染管線

【西川善司】GPU和Shader技術的基礎知識(全8回)

DirectX 10/SM4.0的渲染管線

DirectX 10/SM4.0是Windows Vista專用的,因為嚴密的版本控制沒有產生分支版本。

DirectX 10/SM4.0也發表了在Windows Vista上的獨佔性提供方針,Windows XP和以前的操作系統並不支持。雖然微軟在Windows Vista銷售之前宣稱「Windows XP的支持延長」,但「DirectX 10/SM4.0是Vista及之後版本專用」的方針並沒有改變,實質性的實時3D圖形的進化交給了Windows Vista和以後的操作系統。

實際上,DirectX 10/SM4.0只提供給Windows Vista專用,主要的原因是驅動模型的大幅度改變。

DirectX中的圖形子系統Direct3D,在設計之初並沒考慮到會被同時被多個應用程序使用的情況。而在Windows Vista裡,圖形用戶界面是使用Direct3D 9(Ex)來實現的,Direct3D 10也被另外實現。同時,讓多個3D應用程序運行,對應GPGPU的用途也進入視野,舊的單線程設計很不方便,伴隨著Windows Vista的大變革而被髮布的DirectX 10/SM4.0,對應了多線程,採用了運行穩定性更高的新的GPU驅動程序架構。這就是「WDDM : Windows (Vista)Display Driver Model」。

【千里馬肝注:Windows Vista中的Aero效果,就是直接使用的Direct3D實現的,當使用Win+Tab快捷鍵切換程序時,窗口被渲染在Render Target上以立體的方式展現出來,同時標題欄還使用了blur的shader以實現模糊的毛玻璃效果。】

WDDM驅動程序分為用戶模式和內核模式,這個設計,使得來自應用程序的錯誤驅動控制很難引起系統的崩潰。還有,按照GPU硬件的多線程對應程度,分為WDDM1.0/2.0/2.1等版本。WDDM 1.0負責實現DirectX 9和針對以前的舊設計的GPU,而以DirectX 10為目的開發的GPU,則由WDDM 2.0及以後版本的實現來提供。1.0和2.0/2.1的差別實際是對應多線程等級的不同,1.0對應的是非搶佔式多線程(Non Preemptive Multi-thread), 2.0/2.1是對應的是搶佔式多線程(Preemptive Multi-thread),另外2.0和2.1的區別主要是多線程粒度上的差異,2.1可以在更細小的目標內做線程切換。

【西川善司】GPU和Shader技術的基礎知識(全8回)

【西川善司】GPU和Shader技術的基礎知識(全8回)

Windows Vista的圖形子系統。

非搶佔式是自發的進行線程切換的多線程實現方法,搶佔式是用分時技術(Time Sharing),自動的切換線程的多線程實現方法。

【千里馬肝注:Windows Vista之前的display driver是運行在kernel-mode的,所以有句話是“75%的藍屏都是由display driver引起的”,原因也是相比其他的driver,display driver最為活躍,如此複雜的driver也是由人編寫的,難免會有bug,於是導致了系統的不穩定。那麼從WDDM開始,display driver基本上是運行在user-mode的,為什麼說是“基本上”,那是因為還有小部分的核心模塊“一般被稱作mini port driver”依然放在kernel-mode,於是即使display driver長時間未響應或是崩潰了,不僅有Timeout Detection,還可以Recovery,於是系統相對來說更穩定了。】

從DirectX8開始的可編程Shader,雖然有SM1.x/2.0/3.0的版本制定,但是每次由於GPU製造廠商的獨自擴展,最終變得混亂。這樣的分支版本混在一起,不僅僅用戶挑選產品很難,來自軟件業界的排斥也很大。這樣,微軟在DirectX 10以後,把DirectX 9之前存在稱為

Caps(Capability Bits Test)的這種用作檢測圖形特性是否支持的結構廢棄了,而進行嚴密的版本控制的方案。由於這個方案,宣稱對應DirectX 10/SM4的GPU,必須能實現DirectX 10/SM4.0全部的功能。DirectX 9/SM3.0時代那種NVIDIA支持VTF,ATI不支持VTF的事,在DirectX 10/SM4.0的時代不會再發生。

【千里馬肝:在Direct3D9的年代,因為後綴abc等多個版本中,新增了大量的新特性,作為開發者無法保證使用的特性是否被支持,於是必須通過提供的caps接口來檢測,如果不支持,要麼必須關閉該功能,要麼必須另行實現一套實現達到類似的效果,導致了開發難度的增加。】

這樣,一旦實時3D圖形的基本功能的實現告一段落,今後的功能強化, 因為有很高的複雜度原因,有必要經過業界團體的嚴格討論.。

統一著色器(Unified Shader)架構和全新的DirectX。

對應DirectX 10/SM4.0最先登場的GPU,是NVIDIA的GeForce 8000系列。之後,競爭對手ATI(AMD)才投入了RADEON HD2000系列。

【西川善司】GPU和Shader技術的基礎知識(全8回)

NVIDIA最先發布了對應DirectX 10/SM4.0的GPU NVIDIA「GeForce 8800 GTX」。

ATI和NVIDIA兩個公司對應DirectX 10/SM4.0的GPU,在硬件特徵上的共同點上是採用了[統一Shader架構] (Unfied Shader Architecture)。

在可編程shader上雖然有Vertex Shader、 Pixel Shader以及新的Geometry Shader三種,但在渲染場景中的使用情況,相對於Vertex Shader,Pixel Shader的負荷,新的Geometry Shader,在應用程序裡的使用很有限,並沒有太多需要使用的場合。之前的Vertex Shader、Geometry Shader,Pixel Shader數量固定的Shader Unit分配設計,其實浪費比較大。各Shader,雖然確實在完成各自特有的作用,但實際演算內容是以向量或矩陣計算為主體,各Shader間並沒有太大差異。

如果是那樣,要準備大量的“通用”的可編程Shader Unit,對應不同的運算,把它們作為Vertex shader、Geometry Shader,Pixel Shader來啟用,難道不合理嗎?

這就是統一Shader架構的基本考慮方式.。

根據這個,頂點負荷大時,Vertex Shader能發揮到更多的效能,Pixel Shader負荷高時,Pixel會發揮更多的效能。

【西川善司】GPU和Shader技術的基礎知識(全8回)

以前的GPU中,一旦Vertex Shader或Pixel Shader任意一方出現瓶頸的話,性能就無法提升,而且,也沒法利用空閒的Shader Unit。

統一Shader 架構,因為承擔負荷的shader增加,相應的瓶頸就降低了。

【西川善司】GPU和Shader技術的基礎知識(全8回)

【西川善司】GPU和Shader技術的基礎知識(全8回)

為了稍微看的明白,圖例上邊是以前固定分**式的架構,下邊是統一Shader架構。

雖然ATI比NVIDIA對於DirectX 10/SM4.0 GPU的推出要遲一些,不過[統一Shader架構]實際上在2005年登場的Xbox360-GPU就裡實現了,對於新的架構ATI一方要略勝一籌,儘管不是最早推出DirectX 10/SM4.0的GPU,但在統一shader架構方面,ATI其實是更早推出的。

2008年以後~未來的DirectX「DirectX 10.1」和「DirectX 11"之後"」

DirectX 10是在2007年3月被髮布的,在舊金山召開的遊戲者開發者大會GDC2007上,微軟提到了DirectX 10以後的規劃。

先是DirectX 10的細小變更(minor change)版的DirectX 10.1發佈,Shader Model為4.1版。

作為擴展功能,除了WDDM2.1正式支持以外,擴張了多重採樣方式的抗鋸齒(MSAA:Multi-Sampled Anti-Aliasing)的採樣位置的可編程化,支持多個RenderTarget中個別的進行Present。SM4.0對於Cubemap Array支持機能的擴展進化也完成了。當然,為了統一擴展的步調,雖然10.1裡包含了0.1的尾數,但因為微軟做了很好的版本控制,並沒有更多分支版本登場。

DirectX 10.1/SM4.1包含在2008年3月提供預定的Windows Vista Service Pack1裡,安裝SP1後就可以使用。目前對應DirectX 10.1/SM4.1的GPU有AMD(ATI)Radeon HD 3000系列,S3 Graphics也發表了對應的Chrome 400系列。不過,另一方面NVIDIA表示不會推出對應DirectX 10.1/SM4.1的GPU。於是事實上,對於DirectX 10的支持上,AMD(ATI)和NVIDIA的決策開始出現了不同。

【千里馬肝注:2008年上半年謠傳稱,NVIDIA在年底或者明年年初拿出一款支持DirectX10.1的顯示卡,但NVIDIA公開闢謠稱:DirectX10.1相比DirectX10變化太少,NVIDIA會直接提供對DirectX11的支持。DirectX10.1對NVIDIA顯示卡性能提升無任何幫助,所以NVIDIA並沒有必要去迅速跟進。】

【西川善司】GPU和Shader技術的基礎知識(全8回)

AMD的ATI Radeon HD 3870,最早對應DirectX 10.1/SM4.1的GPU。

【西川善司】GPU和Shader技術的基礎知識(全8回)

S3 Graphics的Chrome 440GTX,以比主流的對應DirectX 10.1/SM4.1 GPU更便宜的價格吸引購買者。

並且,在這個時候,微軟預定發佈DirectX 11。

對於DirectX 11和之後版本中,會實現那些功能雖然還未定,但明確的是會帶來幾個大的變革。

1個是加入可以把GPU更加靈活利用成通用處理器的結構。特別是似乎最初要計劃作為媒體處理器的流處理器在此以後會更容易被使用。具體的還討論了,把向GPU輸送的向量數據結構朝著更靈活的目標擴展,用GPU把處理後輸出的數據流在每個處理結果上做**,分配在多個緩衝buffer的結構。

還有,為了對應3D圖形以外的科學技術計算用途,對應的演算精度從現在的單精度提到雙精度64位小數(FP64)。在性能性方面進行那樣的對應就不用說了,為了把那樣做成通用處理器的性能強化,應該要尋求在GPU上的內存隨機存取性能的強化和緩存系統的改良的要求。

並且,除了DirectX 10/SM4.0的Geometry shader以外,在DirectX 11以後的渲染管線上加入了新的處理Stage,這個就是[Tessellation]階段。Tessellation如果簡單的說,是遵從某種方法把多邊形分割的結構。從DirectX 9/SM2.0開始開始支持Tessellation,但限定在特定的GPU上使用,並不是主流機能。但是,在DirectX 11之後,這個被規定作為正式的標準機能。還有,進行Tessellation的單元,也就是[Tessellator],最初並不是可編程Shader,而是表明作為固定功能單元提供的方針。順便說下,雖然現在並不是DirectX的規格,不過Radeon HD 3000系列搭載了作為固定機能的Tessellation單元。這個會不會成為DirectX 11的正式配置現在還不明瞭。

Tessellator 雖然是是固定單元,但是作為替代,把進行多邊形分割時的控制點在可編程上進行控制,新設了被稱為(Co**ol Point Shader)的第4個可編程shader。這實際上應該說是輔助Tessellator工作的可編程shader,DirectX 11以後的版本,也有進一步在未來的DirectX世代中被整合的可能性。

【西川善司】GPU和Shader技術的基礎知識(全8回)

DirectX 11 以後的渲染管線想象圖

至此,在發表了DirectX 11之後,為了從困擾實時3D圖形多年的課題的透明對象的繪製順序的束縛中解放,把「A-Buffer」的概念用某種形態導入。

實時3D圖形裡,為了避免半透明繪製不正確的情況,需要把3D透明物體從遠往近進行排序。當使用「A-Buffer」,除了在渲染時Shader算出顏色以外,要把輪廓mask信息和深度值信息等一起寫入到FrameBuffer,在最終繪製時,雖然還是要繪製成合乎邏輯的影像,但對於渲染有完全排除繪製順序依

182439shojojue1fnu1aeo.jpg (24.33 KB, 下載次數: 67)

【西川善司】GPU和Shader技術的基礎知識(全8回)



分享到:


相關文章: