2008年6月1日 星期日

PS3 圖形處理器 RSX 硬件解說


根據日本 PC Watch 網站專欄作家 後藤弘茂 最新刊出的專欄文章指出,PS3 預定採用、由 NVIDIA 設計的圖形處理器「Reality Synthesizer(RSX)」,與日前正式發表的 NVIDIA PC 用圖形處理器 G70(GeForce 7800)是採用同相同的基礎設計。

  RSX 是由 PC 繪圖晶片大廠 NVIDIA 所設計,將用於 SCE 新一代電視遊樂器主機 PS3 上的圖形處理器(GPU)產品,於 5 月 16 日 SCE 所舉辦的 E3 展前記者會中首度公布。

  根據發表資料,RSX 是一顆運作時脈 550MHz,3 億個電晶體以上規模的圖形處理器,具備專屬的 256MB GDDR3 繪圖記憶體,每週期可執行 136 個著色器指令,支援 128bit 高動態範圍(HDR)與雙 1080p HDTV 輸出,效能是目前 NVIDIA 最高檔圖形處理器 NV40 的兩倍以上。

  而在 6 月下旬正式發表並上市的 NVIDIA 新一代 PC 用圖形處理器 GeForce 7800 GTX(晶片代號 G70),同樣是個規模約 3 億個電晶體、著色器(Shader)效能是前代 GeForce 6800(NV40)兩倍的產品,與 RSX 已公布的規格有許多類似之處,亦有多方消息指出 RSX 是以 G70 的設計修改而來。

  在 PC Watch 網站最新刊出的後藤弘茂專欄文章中表示,NVIDIA 首席科學家 David B. Kirk 於專訪中曾提到:「RSX 的著色器架構是以 G70 為基礎」,一般預料兩者相異之處主要在於製程技術、系統匯流排與記憶體介面寬度,其餘部分則沒有太大的不同。由於 NVIDIA 先前發表 RSX 可於單個週期內執行 136 個著色器操作,與 G70 的數據完全相同,因此可推斷兩者的著色器構成是相同的。

  根據後藤弘茂得自 GPU 業界相關人士的消息,NVIDIA 之所以會在 RSX 上採用與 PC 產品幾乎相同的設計,是因為 SCE 與 NVIDIA 的合作計劃是在 2004 年夏季才正式簽訂,因此沒有足夠的時間為 PS3 設計一個專屬架構的圖形處理器,所以會採取大幅沿用 PC 研發中產品的設計。

  G70 的著色器構成與相關數據計算方式如下:

8 個頂點著色器(Vertex Shader)x 每週期 2 個著色器操作 = 每週期 16 個著色器操作
24 個像素著色器(Pixel Shader)x 每週期 5 個著色器操作 = 每週期 120 個著色器操作


  兩者相加 = 每週期 136 個著色器操作,與 RSX 所宣稱的數據相同。

  由於 RSX 預定的運作時脈比現有最高規格的 G70 產品 GeForce 7800 GTX 高出 28 %(550MHz 對 430MHz),因此單就著色器的理論處理性能來說,也會高出 28 %。

  而在 RSX 與 G70 主要差異之一的高速系統匯流排 Flex IO,能提供 CPU -> GPU 20GBps 與 GPU -> CPU 15GBps,共 35GBps 的超大頻寬,比目前 PC 上最高速的 PCI-Express 單向 4GBps 雙向共 8GBps 的頻寬來說,高出 3 倍以上,加上 Cell 本身所具備、遠超越現有微處理器的浮點數運算效能,將可與 GPU 緊密結合,提供與以往不同的 3D 圖形處理能力。

  在記憶體介面寬度方面,由於考量到製造成本的因素,因此 RSX 並未採用 G70 的 256bit 寬度記憶體介面,而是採用減半的 128bit,時脈則略為提昇至 700MHz(GeForce 7800 GTX 為 600MHz),單就繪圖記憶體頻寬來說,約為 GeForce 7800 GTX 的 58 %。而且因為目前 NVIDIA 繪圖晶片的設計都是針對 GDDR 類型的記憶體最佳化,所以 RSX 並未採用與 Cell 微處理器相同的 XDR 記憶體,而是採用 PC 顯示卡常見的 GDDR3 記憶體,這部分也可能是因為沒有足夠的時間針對 XDR 進行特化的設計有關。

  在製程技術方面,G70 因為必須趕在今年年中上市,因此選擇了較為保守的 110nm 製程,由台積電代工。而 RSX 由於預定明年春季才上市,且預定由 SONY 與東芝共同營運的 OTSS 半導體廠以較先進的 90nm 製程生產,因此能以較高的頻率運作。由於不同的半導體廠的製程參數不同,David B. Kirk 表示兩晶片雖然採用相同的著色器架構,但在晶片實體設計上是各自獨立進行的。

  由本次後藤弘茂專欄文章的報導以及 David B. Kirk 所透露的資訊,加上先前各方的消息,大致上已可確認 RSX 與 G70 是系出同源的設計。不過由於 RSX 與 Cell 微處理晶片能透過極大頻寬的系統匯流排進行聯合運作,而且 Cell 微處理器有著遠大於 PC 微處理器的浮點數運作效能與內外部頻寬,因此運作方式預料會與 PC 有很大的不同,實際效能仍然只能從實際遊戲的表現來加以評估。

強大性能? Cell處理器技術解剖

導言:最新的CPU運算科技以及最先進的即時3D繪圖技術的展示平台在何處?不是企業伺服器,也不是家用電腦,而是在遊樂器平台上,3大遊樂器主機廠商戰事方興未艾,其中以Sony應用在PS3上的Cell處理器技術最讓眾人注目。

=================================================

 圖說:Cell處理器的問世,代表著全新一代的運算技術正式登場。

前言 2005年,全球遊戲市場產值已經突破了280億美元(IDC調查報告數據資料),3大遊戲主機廠商分別都推出了新世代主機計畫,在硬體的設計概念上雖大異其趣,但是在核心組件上,確有著不小的共通點,如今微軟Xbox360先走1步,意圖搶佔市場先機,然而Sony將上市的PS3卻如芒刺在背,讓微軟如坐針氈。 即使是邁向邊緣化的任天堂,雖然在硬體性能上偏弱勢,卻有著非常突出的遊戲思維。然而Sony與其他兩家遊樂器廠商不同的是,PS3代表的不只是次世代的遊樂器平台,更是推展Cell技術與Blu-Ray Disc的一個里程碑。








Cell的起源

 Sony自從加入遊樂器市場之後,所採用的都是RISC架構的中央處理器,從PS1時代與LSI公司合作的R3000A,與Toshiba及LSI兩大公司合作,為PS2設計了基於MIPS架構的Emotion Engine,到了次世代主機PS3上,更是結合了Toshiba以及IBM公司的力量,組成了STI陣營,從2001起年投入Cell處理器的研發工作,到2005年正式產品面世為止,總共歷時約5年,Cell處理器不止代表了Sony力圖在遊樂器市場上維持霸主的地位,同時也讓Toshiba及IBM這兩大盟友在各自的領域獲得助益。

 過去處理器世界分為精簡指令集以及複雜指令集兩大陣營,並且互相對抗,複雜指令集自然是以Intel的X86處理器為首,精簡指令集這邊則是以PowerPC為大宗,並加上其他如SPARC、ALPHA等使用於高階伺服器的專用處理器,Apple、IBM以及Motorola所組成的AIM陣營過去一直在精簡指令集這塊市場耕耘,但是到了最後,由於微軟的刻意忽略,消費者的市場慣性,加上傳說中支援X86指令集的PowerPC 615難產,Apple轉而與微軟合作爭取支援,並將旗下Mac電腦改採用Intel處理器,而Motorola則是將處理器部門獨立出來,PowerPC架構只留下IBM獨力發展。

 而IBM也一改過去提供各種類處理器產品給客戶的作法,改為全力經營PowerPC這一塊處理器市場,並針對不同的客戶需求,進行PowerPC的各種客製化動作,比如說,供應給微軟Xbox360的3核心XCPU,任天堂Revolution主機所使用的雙核心Broadway處理器,都是基於PowerPC所演化出來的架構,基本上其所有權皆歸屬於IBM,後來與Sony及Toshiba合組的STI陣營,聯合研發Cell處理器,由於IBM處理器部門的長期虧損,這次聯合研發Cell處理器,也頗有背水一戰的感覺。

 STI三大巨頭的合作模式

 STI是由Sony、Toshiba以及IBM所聯合組成,主要使命在於研發Cell處理器,其實在Cell之前,IBM就曾經提供了改版自PowerPC的Gekko處理器供任天堂的GameCube使用,這也是IBM首次跨足遊樂器中央處理器市場。GameCube除了被公認為硬體設計非常的均衡之外,藉由IBM的技術支持,提供了相關的軟體開發套件,因此GameCube的軟體開發也變的相對簡易,雖然GameCube並沒有在遊樂器市場上取得絕對多數,但是與後起之秀的微軟Xbox仍然打了個五五波。

 Sony與IBM的合作也是著眼於此,藉助IBM的軟體開發技術,意圖一掃過去PS2時代因為硬體刁鑽,加上開發函式庫的不完整,致使遊戲開發商難以開發的缺點,基本上,完備的軟體開發套件可以大幅降低遊戲開發的時程以及成本。

 除了PowerPC技術以及軟體開發上的訴求外,IBM還擁有1個很大的優勢,SOI、銅製程以及應變矽技術可以說領先於全球半導體產業,絕緣矽(Silicon on Insulator;SOI)技術是由IBM研發成功,主要是在矽晶片下添增氧化物的絕緣層,避免電氣效應,以降低電源消耗,減少電流的流失,加快IC的處理速度。

 應用到Cell處理器上的製程技術包含了SOI技術以及應變矽技術,應變矽技術是指強迫矽晶格稍做伸展(約1%),穿過晶格的電子遷移率會提高不少,建築在矽之上的電晶體因而得以操作得更快。為了將應力加入矽,晶片製造商將它與其他晶格間距較大的結晶材料結合,比如說採用矽鍺混合物,許多製造商已經採用了這種做法。例如英特爾公司在2004年底上市名為Prescott的Pentium 4 Extreme,就使用了應變矽。Cell在導入這兩項製程技術之後,可以確保在高頻化時代,於超高的效能表現下仍可以維持合理的電力消耗及溫度。

 與Toshiba的合作則是另一個相當有趣的案例,Sony與Toshiba在次世代藍光光碟的競爭上是處於水火不相容的對立狀態,卻在半導體晶片上擁有緊密的合作關係,可見在商場上並沒有絕對的敵我。從過去PS2 Emotion Engine與Toshiba合作以來,Cell算是兩家公司第二次合作了,Sony需要Toshiba的XDR記憶體和eDRAM製造技術支持(雖然最後Cell構並沒有引入eDRAM),而Toshiba則是對可應用於HDTV中的Cell嵌入式版本,以及IBM、Sony兩大公司的半導體技術及資金相當有興趣,這幾個相互的利益關係也促成了這次的合作。


 Cell核心系統架構-跨越傳統CPU設計的思維

 過去CPU設計的目標不外乎是在每一個執行週期執行越多的指令,要不然就是拼命的將時脈拉高,在Pentium 4時代,由Intel主打的時脈戰爭,在行銷手段上不斷灌輸給消費者時脈高就是快的觀念,但是到最後,由於耗電量與發熱量得不到解決,到最後甚至宣告放棄Pentium 4 NetBurst架構,NetBurst架構由於著眼於串流技術應用,在SIMD方面藉由SSE3等技術,在多媒體方面有著不錯的成績,不過串流應用只佔了全部PC應用的一部分而已,也因此讓AMD公司有可乘之機,在遊戲以及辦公室應用上的運算效能,狠狠的壓倒Intel。

 不過並不是管線深效率就一定會差,管線加深,那麼CPU的分支預測演算法及快取記憶體的設計分配就會變的極端重要,Intel當初錯估了形勢,將SIMD等串流應用優先度擺太高,在分支預測的設計上正確度不夠高,造成指令猜錯回取的次數過高,加上管線深,指令要重新填滿管線花費的時間太高,也因此造成了許多應用的運算處理上效能不彰,Cell的管線階層跟Pentium 4差不多深,但是藉由雙issue指令派發,以及執行緒的動態負載功能,加上Cell應用程式的特殊性,因此在分支預測的效率可以得到非常好的解決。

 除了CPU本身架構以外,匯流排的設計也是一大瓶頸,在實際應用中,絕大部分的CPU效能增長都會被緩慢的周邊所拖累,傳統PC架構裡,記憶體與CPU之間的傳輸動作都會有高達數千個CPU週期的延遲,這對運算效能而言是個非常嚴重的浪費,即使提升了記憶體的時脈或加大傳輸頻寬,改善的程度仍然不明顯,所以在桌上型電腦的世界裡,AMD將記憶體控制器內建到CPU晶片中,並透過HyperTransport架構溝通,大幅改善了過去被詬病的記憶體延遲現象。Cell架構中,則引入了Flex I/O架構,有效擴大了CPU與記憶體和繪圖晶片之間的通道。

 那麼STI是如何去設計Cell架構的呢?Cell處理器當初發布時,是定位在網路處理器,在最主要的核心部分,是採用64位元PowerPC核心,每週期2指令派發的超純量架構,擁有512KB快取記憶體,官方命名為PPE(Power Processor Element)。PPE內建了Fine-grained多執行緒架構,可以在2個執行緒中動態偵測指令的密度,處理器會平均在2條執行緒中抓取指令,當2條執行緒中有1條過於空閒時,處理器就會自動會拉高另1條執行緒丟指令的速度,提升的幅度約從雙週期1個指令拉高到每週期1個指令。

 多執行緒應用在向Cell這種管線階層深的處理器上,其效用非常明顯,由於管線深,如果其中1個執行緒發生了分支預測失敗,那麼重新取得指令回填管線的時間延遲將會非常巨大,就Cell的PPE來說,分支預測失敗的話,會有8個週期的管線效能損失,以及4個週期的快取記憶體存取時間損失,採用多執行緒之後,如果其中1條執行緒出現分支預測失敗,這時處理器就可以全力處理另1條執行緒的指令,讓另1條執行緒可以有時間將預測失敗所損失的時間補回來。

 圖說:PPE在1個時脈週期內可以同時預取4個指令,並派發兩個指令,為了加強在其in-order管線處理上的效率,PPE使用了延遲執行管線,並可以允許有限制的載入out-of-order指令的方式執行,因此在out-of-order的執行上,可以不需要太複雜的設計即可取得良好的效能增加。
 除了PPE這位老大以外,Cell處理器之中還包含了8個跟班,這些跟班叫做Synergistic Processor Elements,簡稱SPE,也可以稱作Synergistic Processor Unit(SPU),這8個SPE都是具有256KB Local Store SRAM以及記憶體流量控制器(MFC,但實際上做的是DMA的動作)的處理單元,雖然只有256KB,不過Local Store可以稱做是SPE的主記憶體,而不是快取記憶體,因為Local Store記憶體的存取都必須透過軟體來控制。

 SPE是基於SIMD的處理單元,每個SPE都是針對32位元單精度最佳化的4路SIMD處理單元,雖然SPE也支援雙精度浮點計算,但是性能會降到約1/10,每個SPE之中包含有128個超低延遲的128位元暫存器,暫存器數量的龐大,也可以有效降低存取Local Store的次數,SPE的指令集源自於PowerPC的向量擴展VMX/AltiVec和PS2 Emotion Engine的向量單元指令集,在極限狀態下,8個SPE可以在4GHz的時脈下,提供高達256GFlops的運算能力,拿實際的例子來說,IBM在2005年11月30日所公布的效能測試報告中指出,單一SPE處理單元即可以每秒77頁的畫面張數,處理18Mbit/s流量的HDTV MPEG 2串流解碼。

 圖說:SPE的SIMD指令可以同時操作16個8bit整數、8個16bit整數以及4個32bit整數,或是單週期4個單精度浮點運算,在3.2GHz的運作時脈下,可以提供高達25.6Gflop/s的單精度運算。在這張圖中,我們可以看到每個處理單元的配置狀況,當1組被預取的指令集中,擁有2個可以被派發的指令時,SPE就會啟動雙重指令派發,其中1個指令會被Even Pipeline執行,而另1個指令則會送往Odd Pipeline執行。(圖片來源/IBM網站)

 有了這麼強力的計算核心,當然也需要在匯流排上作文章,記憶體子系統要能滿足Cell的資料讀寫需求,那麼Cell的處理效能也才有發揮的餘地。Cell的I/O以及記憶體子系統都是由RAMBUS取得授權的技術。做為主記憶體使用的XDR記憶體子系統,擁有兩組記憶體控制器,能提供25.6GB/s頻寬,相較起目前PC主流DDR及DDR2記憶體3.2GB到6.4GB的頻寬,其差距不可謂不大。

 而Cell與繪圖晶片之間的通道,則是採用FlexI/O技術,FlexI/O提供了7組TX(信號發送)8bit通道(Lane)和5組RX(信號接收)8bit通道,每條通道在4GHz傳輸速率下提供的傳輸頻寬是3.2GB/s,合共38.4GB/s的I/O頻寬。依照目前Cell運作的時脈來估算,讀取速度可達20GB/s左右,而寫入則是15GB/s,大大超越了目前PC平台上主流的PCI Express 16x的4GB/s上下傳輸速率。Cell的FlexI/O是為雙處理器SMP設計的,如果想連接更多的Cell還需要增加1個HUB才行(4個Cell配1個Hub,設計上為光纖Hub)。

全景反鋸齒FSAA 簡介

FSAA 是 full scene anti-alias 的縮寫,有些人將其譯為全景反鋸齒,還算是合理。不過,倒底 FSAA 是什麼呢?為什麼要「全景」(full scene)?「半景」不行嗎?(其實相對於 FSAA 的是 edge AA,「邊緣反鋸齒」)反鋸齒(anti-alias)又是怎麼回事呢?


要弄清楚什麼是 FSAA,就得先從 AA(anti-alias)開始。要弄清楚 AA,只好說明一下取樣(sampling)這個麻煩的東西了。對於電腦繪圖有些瞭解的讀者,應該已經知道,目前的電腦繪圖使用的是 2D raster 的顯示方式。也就是說,畫面是由一大堆有不同顏色和不同亮度的小點,組成一個大的方陣。這些小點稱為像點,即 pixel,pixel 是 picture element 的縮寫。很明顯的,像點的數目愈多,圖形就會愈細緻。我們常說的解析度就是指這些像點的數目。例如,640×480 這個解析度,就表示畫面是由 307,200 個像點所組成的。
註:解析度在某些領域有不同的意義。在印刷的情形下,一般所謂的解析度,通常是以 DPI(dots per inch)為單位,即每英吋中含多少個點。像是某個印表機,若有 600 DPI 的解析度,就表示它每英吋可以包含 600 個點。所以,在一張 8.5"×11" 的紙上,就會有 5,100×6,600 = 33,660,000 個點。當然,紙愈大的話,點的數目就可以愈多,這是因為點的大小是固定的。在顯示幕的情形下,不管螢幕有多大,使用 640×480 這個解析度時,像點的數目都是 307,200 個,這和印刷的情形是不同的。當然,通常愈大的螢幕能容許愈高的像點數目。

當然,像點的數目是有限多的。不幸的是,這個世界並不是由有限的小點組成的。好吧!也許它是由有限的小點組成,但是這些小點的數目非常的多,所以以人類巨大的眼睛來看,就好像是完全連續的一樣。這樣一來,用有限的像點來表現畫面,就會出現問題。但是,只要像點的數目夠多,而且像點的大小夠小,小到人類的眼睛無法分辨的情形下,不就沒問題了嗎?當然會有問題,不然就不需要 FSAA 了。

問題在哪裡呢?問題在於取樣的方式。取樣是指把一個連續的訊號,轉換成不連續(離散)的訊號的動作。因為像點的數目是有限多的,所以它一定是不連續的,所以當然就需要這個取樣的動作了。下圖是一個取樣的例子:

**

上圖中,黑色的曲線是原始訊號,灰色是直線是取樣點,下圖則是取樣的結果。簡單的說,就是把曲線上面每個取樣點(就是那些灰色直線所在的地方)的數值取出來,這樣就是取樣的動作。一般來說,取樣點之間的距離是固定的。以電腦圖形的例子來看,每個像點就是取樣點。不過,電腦圖形是從一個二維的訊號中,取樣得到一個二維的陣列。所以,取樣看起來是會損失資訊的。另外,因為電腦是以數位的方式存放資料,所以還要把取樣的結果進行數位化。數位化可以看成是「轉成整數」的動作。例如,假設訊號的範圍是 0 ~ 1 之間,想要數位化成 8 位元的資料,就是先把它乘上 255(8 位元數字可以表示 0 ~ 255 的範圍),然後把結果以四捨五入或是直接捨去的方式轉成整數。這個動作當然也會損失資訊。不過,這部分和我們的主題無關。

取樣會牽扯到很多複雜的定理。例如,在做取樣之前,如果先經過一個 low pass filter,把高頻的部分濾掉,再設定適當的取樣頻率(通常是比是最高頻率的兩倍還大)。這樣處理過的訊號再去取樣,就可以完整還原到原來的訊號(指經過 low pass filter 後的訊號,而不是最原始的訊號)。當然,這篇文章並不是什麼教材,所以不會深入這些地方。不過,low pass filter 等一下會用到,所以先記著比較好。


[Part 2]

現在我們來看看,在電腦繪圖中,取樣的情形是什麼樣子。為了簡單起見,我們用兩個三角形來做例子。如下圖:

**

上圖中,灰色的線是像點的邊界,當然,實際上像點是不會有什麼邊界的,就算有也很細,不會這麼粗。這些邊界只是示意用的。每個像點中的小黑點就是取樣點。取樣的時候,就是取這些小黑點上面的顏色,做為整個像點的顏色。所以,取樣的結果如下圖:


**
我想大家應該都看到鋸齒現象了吧!這就是一般 3D 繪圖中所遇到的情形。為什麼會這樣呢?其實,這是因為我們在取樣之前,少了一個步驟:low pass filter。因此,原來訊號中的高頻部分並沒有去掉,所以才會出現鋸齒現象。對了,所謂的 low pass filter,就是指一個只能讓低頻成分通過的過濾器。詳細的細節就不在這裡說明了。現在只要記住一件事就夠了:box filter 是一種 low pass filter。也就是說,如果我們把一個像點的範圍內,所包含的訊號取其平均值的話,這樣就會是一個 low pass filter。經過這樣的動作,再來做取樣,會得到下圖:

**

把上面的兩個例子都縮小到實際的大小,會得到下圖:

**

兩者之間的差異應該是相當明顯吧!

有些讀者可能會對 low pass filter 有疑問。為什麼用了 low pass filter 消除高頻成分就會有比較好的效果呢?實際的理論相當複雜,所以不在這裡多說。不過,如果以人眼實際上的觀察方式來看,倒是很合理的。因為,人眼內部的感光細胞,是會收集它的感光範圍中的所有能量,再送到腦部。所以,可以看成感光細胞其實就已經包含了一個 box filter。因此,在進行取樣之前,先做 box filter 是很合理的做法。

有一點要特別注意:如果顯示系統的解析度非常的高,遠遠超出人眼可以分辨的範圍,那麼 anti-aliasing 的效果就會慢慢消失。以一般習慣上的閱讀距離來說,人眼很難分辨超過 300 DPI 以上的彩色點。也就是說,對一個對角線為 15" 的顯示器來說,如果解析度高達 3,600×2,700 的話,那就沒有做 anti-alias 的必要了,反正人的眼睛也沒辦法看到這麼細的像點。不過,貼圖的 filtering 是不同的事,無論解析度有多高,都需要適當的貼圖 filtering 才不會出現不正常的情形。


[Part 3]

現在來看看 3D 繪圖晶片要怎麼處理這個問題。目前的 3D 晶片,幾乎都是用 by primitive 的方式畫出整個畫面的。所謂的 by primitive,就是指一次畫一個 primitive,把每一個 primitives 都畫好之後,整個場景就畫好了。Primitive 是指三角面和由許多三角面組成的簡單東西。這種方法和 ray tracing 或是 scanline renderer 是不一樣的。這兩者都是分別對畫面上的每個像點,去決定它應該會是什麼顏色。

另外,現在的 3D 繪圖晶片通常是利用 Z buffer 來去除隱藏面(即被其它三角面蓋住的部分),而不對三角面做任何排序動作。這當然是有原因的,因為如果對三角面做排序,再以「由後面往前面畫」的方式來去除隱藏面的話,有時就需要把某些三角面切開,還有一些很麻煩的東西,這樣的工作並不適合由記憶體很少的 3D 繪圖晶片來做。當然,讓 CPU 來做這個工作,速度也不會很快。無論如何,Z buffer(或是其它類似的方法)還是目前最有效率的方法之一。

現在來看看 3D 晶片要怎麼做到 anti-alias。一個最簡單的想法是,讓 3D 晶片在畫三角面的時候,就自動產生適當的「佔有率」數字,即這個三角面在某個特定的像點上,所佔有的面積的比例,而該像點的顏色則會乘上這個比例。這樣一來,就可以畫出平滑的三角面了。當然,對於三角面來說,三角面的內部像點所佔的面積比例當然都是 100%,只有在邊緣的地方才會有小於 100% 的佔有率。所以,這個方法也稱為 edge anti-alias。

不過,這個方法有一些問題。例如,當兩個三角面有重疊的時候,「佔有率」的計算就會出問題,因為 3D 晶片只知道將被蓋住的三角面,其佔有率的數字;但是,它卻沒辦法知道被蓋住的三角面,倒底是佔有哪些部分。最嚴重的問題,則是出現在三角面有交叉的時候。這時,因為交叉的地方是由 Z buffer 算出來的,所以根本沒辦法算出正確的「佔有率」數字。所以,除非三角面都沒有交叉,而且重疊的情形都還在合理範圍,不然的話,這個方法是不能用的。如果三角面都已經排序且切割過,那就可以使用這個方法。但是,就如同前面所說的,目前不太可能即時做這些動作。

如果需要畫的東西不是三角面,而只是線框的話,那麼 edge anti-alias 就很適用了。因為,線框很少會有交叉的現象(兩條線就算是交叉,也沒人會注意到吧!),而且,兩條線重疊的情形也不多。所以,edge anti-alias 非常適用在線框繪圖。某些應用像是 CAD/CAM 等等,特別常用到線框繪圖,所以他們會喜歡用 edge anti-alias。不過,對於模擬、視覺化、或是 3D 遊戲來說,線框繪圖很少用到,所以 edge anti-alias 就不太適用。

另外有一點要注意的是,edge anti-alias 只處理三角面的邊緣部分。當然高頻成分也是在邊緣最為明顯。但是,如果三角面有貼圖的話,還是可能會出現高頻成分。不過,一般來說,貼圖的 anti-alias 通常可以很容易用雙線性內插(bilinear interpolation)和 mipmap 來解決。這部分比較複雜,以後再特別討論。

說了這麼多,終於要說到 FSAA 了。為什麼叫 full scene 呢?它就是指對整個畫面做 anti-alias,而不是像 edge anti-alias 只是對某個 primitive(如三角面或是線)做 anti-alias。那麼,要怎樣對整個畫面來做 anti-alias?

一個簡單的方法,就是使用在每個像點中,取幾個 sub-sample 點,然後把這些 sub-sample 的顏色取平均值,做為這個像點的顏色。這樣的方法就稱為 super-sampling。很明顯的,這種做法完全不需要什麼特別的設計,不用切三角面,不用排序,直接就可以得到 anti-alias 的效果。所以這是一種 FSAA 的方法。

最簡單的 super-sampling 方法是 ordered grid super-sampling,簡稱 OGSS。所謂的 OGSS,就是把直接把解析度提高,再用 box filter 把它縮小。例如,假設要對 640×480 的解析度,做 4 個 sample 的 FSAA,那就把解析度提高為 1280×960,畫出整個畫面,然後再用 box filter 把它縮小到 640×480。為什麼稱為 OGSS 是因為它的 sub-sample 點等於是排成方形,如下圖所示:


***

上圖中,左邊是原來的解析度方式,大的灰色圓點是原來的取樣點。放大解析度為四倍之後(每邊各兩倍),會變成右邊的情形。這時,在新的解析度下,新的取樣點是紅色小點。對每個原來的像點來說,它會取內部的四個紅色小點的平均值,做為它的取樣值。所以,這些紅色小點就是它的 sub-sample 點。可以看出,它的 sub-sample 點正是排成方形,所以才會叫做 OGSS。


[Part 4]

OGSS 有什麼缺點嗎?要看出它的缺點,得先看下面這張圖:


***

上圖中的這些三角面,顯示出邊線的角度和 aliasing 程度的關聯。從最左邊的三角形來看,可以看出完全垂直線、完全水平線和 45°的斜線,都不太會顯示出 aliasing。但是,接近垂直或接近水平的線,會顯示出最明顯的 aliasing。不幸的是,因為 OGSS 的 sub-sample 點是垂直和水平的排列,所以在處理接近垂直或水平的線時,通常只有兩個 sub-sample 會發生作用。如下圖所示:

**

在上圖中,當深藍色的三角形經過這些 sub-sample 點時,可以看出這三種方法,會得到明顯不同的結果。在兩個 OGSS 的例子中,每個像點都剛好有一半的 sub-sample 點包含在三角形裡面,所以它們的表現是完全相同的。當然,如果三角面再延長一些,4 samples 的 OGSS 的表現就會比 2 samples OGSS 要好一點。但是,這已經可以顯示出 OGSS 的表現,在接近垂直或接近水平的線,是不太好的。事實上,在線愈接近 45° 時,OGSS 的表現就會愈好。但是,前面也提過,45° 的線其 alias 的現象並不會很嚴重。再者,如果線真的是 45°,那 OGSS 的結果還是不會好,因為每個邊緣的像點,都會剛好有三個 sub-sample 點在三角面裡面(或外面),而正確的值應該是兩個。

如果把 sub-sample 點稍微轉動一下,情形就會改觀了。如果不希望在接近 45° 的時候會有較好的結果,那只要把 sub-sample 點轉動一些角度,就會讓接近垂直或水平的線對每個像點的 sub-sample 點「看起來」像是 45° 了。在上面的圖中就可以看到明顯的結果。因為 sub-sample 被轉動某個角度,所以這個方法稱為 rotate grid super-sampling,簡稱 RGSS。

很明顯的,RGSS 是不能用「提高解析度」這個方法來達成的。那要怎麼做到 RGSS 呢?基本上,方法並不難。只要在畫三角面的時候,把每個三角面稍微移動位置,這樣就和移動像點的取樣點,是同樣的效果。所以,要做到像上圖的 RGSS,只要把整個場景畫四次,每次都稍微移動每個三角面,到適當的取樣點位置(移動的範圍會小於一個像點的大小)。最後,再把這四張圖合起來,對每個像點取平均值,就可以得到結果了。傳統上,這可以利用 accumulation buffer 來達到。不過,accumulation buffer 需要很大的頻寬(每次從 frame buffer 複製到 accumulation buffer 需要兩次讀取和一次寫入),而且 accumulation buffer 通常需要比一般 frame buffer 更高的精確度才行,所以又需要更多頻寬。再加上 4 samples 的 FSAA 已經需要把整個場景畫出四次了,所以速度一定會很慢。

另一個方法是利用多個 frame buffer,這也是 3dfx 的 T-Buffer 的原理。這個方法是讓顯示晶片保有四個不同的 frame buffer,並把四個 sub-sample 的圖分別畫到這四個 frame buffer 中。而顯示晶片的 RAMDAC(把 frame buffer 輸出到螢幕上的裝置)則自動把這四個 frame buffer 的內容做平均。這樣一來,就不需要高精確度的 accumulation buffer,而且也沒有明顯的額外頻寬需求。因此,對於 sample 的數目很少的情形下,這的確是個取代 accumulation buffer 的好方法。

現在 DirectX 8 中的 DirectGraphics 也加入了 multi-sample buffer 的支援,基本上就和 3dfx 的 T-Buffer 是完全相同的。所以,將來的 3D 顯示晶片都很可能會支援這樣的功能。

CryEngine2 登錄遊戲機平台????



IGN:你们已经将CryEngine推销给XBOX 360和PS 3平台的游戏开发商,目前是否有CryEngine电视游戏正在开发中?

Harald Seeley:在今年的GDC上,我们刚刚为其他游戏开发商提供了游戏机平台CryEngine的预览版,该版本目前需要继续改进完善,因此还无法为其他公司提供游戏机平台的引擎跟配套开发工具。目前Crytek有多个分部、分组正在从事游戏机平台游戏的开发工作。

IGN:您能跟我们说说目前已经购买PC版或游戏机版的CryEngine的公司有哪些吗?

Harald Seeley:像我们购买引擎的公司数量正在不断增长,因此对于这方面的信息,大家可以到我们的新网站:www.cryengine2.com上查看。我前面已经说过,游戏机平台的CryEngine尚未准备好,在发布前我们必须尽量确保移植版本的稳定性,Bug必须相对少,性能也必须达到要求……在这一些未经确定之前就贸然发售必将对我们的技术跟品牌带来负面影响,而这是Crytek所不愿意看到的。

IGN:PS3和XBOX 360版本的引擎在性能表现上跟PC版是否有不同?对于不同平台版本的CryEngine,Crytek是否对其进行了适当的优化跟功能删减?

Harald Seeley:没错,针对不同平台我们都对引擎进行了优化和裁剪。对于游戏机平台的移植工作,我们需要特别关注的不仅仅是CPU、显卡等硬件的兼容性,游戏机的小容量内存、部分机型缺乏硬盘以及微软、SONY的最低要求等方面都是我们需要认真对待的,每一点都影响着我们的移植工作该如何进行。


一旦优化到位之后,游戏机版本的画面效果将令人惊叹。我们预计最终效果能够达到或接近PC版本的“高设置”水准(可能是指CRYSIS的全HIGH设置,这里没有具体说明)。而事实上,console系统内存不足的问题对AI系统的移植所造成的障碍更大,对渲染引擎跟物理系统的移植工作影响反到没那么大,这是大家所始料未及的。


IGN:能否说说您对PS3跟XBOX 360的看法?Wii又如何?是否有希望在Wii上看到CryEngine游戏?

Harald Seeley:毫无疑问在目前两个游戏机平台的移植项目中,PS3的移植工作要比XBOX 360更具挑战性!但障碍最终在开发后期都已经被清除。我们觉得自己有能力去发挥PS 3平台的潜力,因此可以预计采用CryEngine 的游戏将明显不同于那些非CryEngine的游戏。对于Wii,我们觉得Wii平台由于其硬件已经软件的特殊性,对第三方引擎和开发工具的需求性不大,因此短期内我们不大可能将CryEngine移植到Wii上。

最強圖像CryENGINE2引擎技術解說





CryENGINE2引擎
是由Crytek開發的遊戲引擎,來自於《極地戰壕》(Far Cry)使用的CryEngine引擎的升級。目前使用此引擎的遊戲為Crytek所開發的《末日之戰》(Crysis)。瑞典的遊戲開發商MindArk已經簽約使用此引擎在他們的遊戲──Entropia Universe。第一個和CryENGINE2引擎簽約的是法國公司IMAGTP,用來在開始興建之前,對客戶展示建築物完成時的樣貌。

2007年5月7日,開發工作室Avatar Reality, Inc.簽約使用CryENGINE2,創造了一個主題為被殖民的火星的大型多人虛擬世界。[1]同年9月17日Ringling College of Art & Design成為第一個使用CryENGINE2作為教育目的的團體。Crytek也宣佈將以這個引擎開發一套新的遊戲。


技術

CryENGINE2具有許多繪圖、物理和動畫的技術以及遊戲部分的加強,其中包括:

體積雲
即時動態光影且沒有事先計算的陰影
場景光線吸收
3D海洋技術
場景深度,當注視在某物體上時會使其它部分模糊
移動時的模糊特效
物件真實的動態半影
真實的臉部動畫
光透過半透明物體時的散射
可破壞的建築物
可破壞的樹木
進階的物理效果讓樹木對於風、雨和玩家的動作能有更真實的反應
載具不同部位造成的傷害
高動態光照渲染
可互動和破壞的環境
進階的粒子系統,例如火和雨會被外力所影響而改變方向
日夜變換效果
光芒特效並且可以產生水底的折射效果
以視差貼圖創造非常高解像度的材質表面
16公里遠距離的視野
人體骨骼模擬
程式上運動彎曲模型


CryENGINE2也支援Shader Model 2.0、3.0(DirectX 9)和4.0(DirectX 10),並且支援多核心技術來獲得對稱多處理機(Symmetric multiprocessing)和超執行緒(Hyper-threading,HT)。CryENGINE2同時支援32和64位元版本,Crytek表示使用64位元系統將會提升10%至15%的效能。[2]引擎不支援任何的物理處理器(例如AGEIA PhysX)[3],CryTek發展了他們自己的物理引擎稱作CryPhysics。




使用CryENGINE2引擎的遊戲
末日之戰(Crysis)
Merchants of Brooklyn[4]
Entropia Universe──MindArk開發[5]
Blue Mars──由Avatar Reality, Inc.開發
Crytek未公開以此引擎開發的新遊戲
Vigilance──軍事訓練遊戲









高動態光照渲染技術解說(High-Dynamic Range,簡稱HDR)



何為HDR?

動態光照渲染(High-Dynamic Range,簡稱HDR),電腦圖形學中的渲染方法之一,可令立體場景更加逼真,大幅提升遊戲的真實感。

現實中,當人由黑暗地方走到光亮地方,眼睛會自動眯起來。人在黑暗的地方,為了看清楚物件,瞳孔會很大張開,以吸收更多光線。當突然走到光亮地方,瞳孔來不及收縮,所以唯有眯上眼睛,保護視網膜上的視神經。

而電腦是死物,唯有靠HDR技術模疑這效果——人眼自動適應光線變化的能力。方法是快速將光線渲染得非常光亮,然後將亮度逐漸降低。而HDR的最終效果是亮處的效果是鮮亮,而黑暗處的效果是能分辨物體的輪廓和深度,而不是以往的一團黑。

當HDR技術使用時, 現舉例一場景: 陽光普照下,水旁有一道牆壁。當陽光由水面反射到牆上,晴朗而明亮的天空會稍微暗一些,這樣能有助表現出水面的反光效果。當人們低頭看水面,陽光會反射到人眼中,整個畫面會非常光亮,並逐漸減弱,因為人眼適應了從水面反射的光。



無法在開啟HDR的情況下打開FSAA(全屏抗鋸齒)的原因:


在初期,顯示卡技術不夠成熟,NVIDIA使用OpenEXR作為HDR運算的緩存格式,而GeForce 6和GeForce 7系列顯示卡都只提供了對OpenEXR的16位浮點(FP16)貼圖和存儲支持。但在DirectX 9.0模式下運行FP16時,霸佔了原本屬於全屏抗鋸齒的緩存區域,令開啟HDR效果後無法進行FSAA處理。這導致NVIDIA顯示卡在遊戲中無法同時支援FSAA和HDR。

ATi則在其Radeon X1 Series中,使用指定另外緩衝區來解決這個問題,不過由於這是API的限制,程式設計者還是必須對遊戲進行改做才能實現HDR+FSAA。

這是一個列表關於顯示卡可以或可能支援HDR。這是由於支援HDR的最低要求是支援Shader Model 2.0 (即DirectX 9),任何顯示卡支援Shader Model 2.0就可以支援HDR。但是,軟體使用HDR可能大幅度影響其效能,所以敬請使用者注意其硬件要求,以獲得較佳效能。