在 2000 年我們說個人電腦圖形界最大的變革是將原本由 CPU 負責的 T&L 運算移交給 GPU,隨著時間即將進入 2001 年,下一場革命也已經在醞釀當中,基本上 2000 與 2001 年應該是 GPU 架構變動最劇烈也最為密集的兩年。

2001:可程式化管線架構

dxa8001

由於 DirectX 從 6.0 版本開始在市場上占有重要地位,從 7.0 版本開始與 OpenGL 成為市場上唯二的主流 (GLIDE 已經躺在旁邊半死不活了),但 OpenGL 直到 2003 年之前其實都沒有引入太大的變革,因此 2001 年 GPU 架構上出現的革新基本上幾乎可以說是與 DirectX 8.0 的發展切齊的,所以接下來我要先稍微介紹一下 DirectX 8.0 引入的新特色。

發展方向的轉變

在 2001 年以前,基本上 GPU 的發展目標非常明確,除了增加每秒能生成的多邊形數量之外,就是盡可能在同樣時間內處理更多、更複雜的材質貼圖,在 3D 圖形的初期來說,這樣的做法絕對是正確的,畢竟構成圖形用的多邊形不夠多,立體圖形就會顯得粗糙;材質貼圖不夠複雜、豐富,立體圖形的表面看起來就不真實,在這樣的思維底下,為了追求速度與避免過於複雜的架構設計,當時的顯示晶片中的各個單元的功能是「固定」的,只能根據晶片上設計好的模式 (State) 來運作,每個步驟要做哪些事情都是固定的,並不能隨著場合不同而有所變動,稱之為固定功能管線 (Fixed Function Pipeline)。

akt8088

舉例來說,一筆資料進入 GPU 之後,首先要進行頂點處理、T&L 運算、多邊形生成、視角運算、材質貼圖等過程,如同大量生產的生產線一般,每個像素需要經過的工序都完全相同,不能因用途不同而運用軟體方面的手段給予差別待遇。

固定功能管線的困境

但是在面對更加複雜 (卻也更加現實) 的 3D 畫面時,舊有的思維顯然是不敷使用的,舉例來說,在大自然的景象當中經常出現的水面波紋,若用原有的思維來處理,顯然得把整個畫面拆成 N 多倍數個的多邊形與 N 多倍複雜的貼圖來處理,但這樣肯定是不合效益也不切實際的吧?在這種時候,如果可以讓這些功能能夠依據實際狀況來隨機應變,那不是很好嗎?於是人們開始思考,要怎麼樣讓 GPU 內的各個部分「更有彈性」一些。

首先要思考的問題是,要達到這個目的我們該從硬體著手還是軟體著手呢?如果從硬體著手,那顯然我們得在硬體上老老實實地把各種不同功能的電路通通塞進去,但這顯然會造成電路複雜度無量上升,連帶導致晶片的設計、生產成本也一飛衝天,所以這條路顯然行不通。

既然從硬體硬上的手段行不通,顯然我們得加上軟體的協助。於是我們得回到整個電腦的架構開始重新思考,顯然在電腦當中與 GPU 在設計上最為接近,又能根據軟體交辦的事項隨時隨機應變處理各種運算的代表就只有 CPU 了,那麼我們如果像設計 CPU 那樣,把顯示晶片上負責「某些功能」的「某些部分電路」改成「支援某些功能」的「處理器」,是不是就能達到我們要的目的了呢?

Shader Model 的誕生

於是為了達到剛剛所說的目的,微軟在 DirectX 8.0 當中首次引入了被稱為「Shader Model」的概念,而在 DirectX 8.0 當中,Shader Model 主要又可以分為 Vertex Shader (頂點渲染器) 與 Pixel Shader (像素渲染器) 兩種。

axe8051

單從字面上來看可能不是很容易了解這兩種渲染器到底有甚麼功能,所以我們要再次回到剛剛看過的固定功能管線上,以往像素資料進入 GPU 時,要先經過 GPU 內「硬體 T&L」運算電路的處理,而 Vertex Shader 實際上就是用來取代原本在 2000 年剛剛加入 GPU 內不久的硬體 T&L 電路用的,本質上如同前面所說,可以想像成一種「主要指令集由各種 T&L 相關功能組成」的「小型處理器」,於是軟體工程師就可以透過編寫軟體的方式來達到一定程度上彈性調整、改變 T&L 功能的效果了。

axe8052

至於 Pixel Shader 的部分其實也是基於差不多的想法發展出來的,主要是用於取代原本負責將材質貼圖與像素融合這道工序的電路之用,在經過這樣的變革之後,軟體工程師能夠發揮的地方一下子多了很多,因此在 DirectX 8.0 開始遊戲的畫面品質可以說是有了飛躍性的成長 (儘管第一版的 Shader Model 還很陽春,而且只能用低階語言控制),接下來基本上每次 DirectX 的改版都多多少少會對 Shader Model 做一點更新,例如根據軟體工程師的需要來增加這些 Shader 所能支援的指令之類的,最後,由於從這個時期開始,軟體工程師可以透過程式來控制甚至改變 Shader 的功能或表現,因此被稱之為「可程式化管線」(Programmable Pipeline)。

NVIDIA GeForce3 (NV20)

發佈時間:2001 年 03 月
API 支援:Direct3D 8.0、OpenGL 1.2
Shader Model 版本:Vertex Shader 1.1, Pixel Shader 1.1
像素渲染器 (PS):4 組/頂點渲染器 (VS):1 組/材質對應單元 (TMUs):8 組/著色輸出單元 (ROUs):4 組

gfx3003

NVIDIA 在 2001 年初推出的 GeForce3 是世界上第一款配合 DirectX 8.0 規範而推出的產品,基本上是從上一代的 GeForce2 修改而來,同樣是採用 4 條像素管線、8 組 TMU 與 4 組 ROU 的配置,但如同其代號又再次從 NV15 跳到 NV20 所顯示的,在架構上 GeForce3 的變動其實很多。

gfw8099

相較於上代產品來說,GeForce3 最主要的改進有三個地方,首先要提的是被 NVIDIA 官方稱之為 nFinite FX Engine 的技術,實際上 nFiniteFX Engine (有不少人懷疑這名字是不是與 3dfx 有關,畢竟 NVIDIA 剛在幾個月前收購了 3dfx 的所有技術,不過我個人認為應該只是名字用到而已,畢竟距離收購案宣布只過了三個月而已) 就是我們剛剛花費不少篇幅探討的 Shader Model,這是 GeForce3 與前作之間最大的不同。

但 nFiniteFX Engine 的引入實際上並沒有讓 GeForce3 成為一代成功的 GPU,一方面因為初期能夠得益於這項技術的遊戲軟體並不多 (跟 GeForce256 第一次加入硬體 T&L 時的狀況很像),另一方面是因為牽涉到架構方面的大幅改變與重新設計,這很大程度影響了 GeForce3 的實際表現與生產良率 (這又直接影響了生產成本,並且進一步牽動了價格)。

akv8052

第二個不同則是在記憶體頻寬的利用機制上,GeForce3 引入了被稱之為光速記憶體架構的 Lightspeed Memory Architecture (LMA) 技術,有效解決了過去 GeForce256 與 GeForce2 最大的弱點-記憶體頻寬不足,某種程度上你可以把它當成 NVIDIA 家的 HyperZ 技術來看 (儘管實作的方式並不完全相同,但目的與結果是相似的,也用到了一些類似的東西,像是 Z-Buffer 壓縮技術之類的)

aew8052

而最後一項不同則比較沒有前兩項那麼來得重要,GeForce3 的反鋸齒能力相較於前幾代 GeForce 來說有了明顯的提升,NVIDIA 將這項技術稱為「高解析度反鋸齒 (HRAA)」,具體上來說是運用一種稱為「Quincunx」的特殊演算法 (抓兩條對角線組成一個梅花點的形狀) 來執行多重取樣反鋸齒 (MSAA),由於需要的取樣點比起以往使用超取樣反鋸齒 (SSAA) 時來得少,所以在速度上比起 SSAA 來得快上許多,但是在效果上又與過去使用的反鋸齒相差無幾 (理論上 2x Quincunx MSAA 差不多就能有 4x SSAA 等級的效果)。

pcp8065

至於在系列編成的部分呢,相較於 GeForce2 由 GTS 與 MX 兩大家族分別負責高、低階市場的作法而言,GeForce3 的家族組成顯得單薄許多,受到第一次導入可程式化管線設計但技術還不夠成熟的影響,最原始的 GeForce3 (2001 年 02 月推出) 由於在繪圖管線配置上與 GeForce2 GTS 很相近 (有著幾乎相同的理論像素填充率),因此在性能測試中沒辦法佔到太多便宜 (甚至由於時脈較低,很多時候還會反過來輸給 GeForce2 Ultra),基本上可以視為具備可程式化管線設計的 GeForce2 GTS,但由於價格高昂許多卻沒能帶來太多性能提升,因此在市場上並未獲得太多親睞,可以算是典型的「付出很多心力卻沒甚麼收穫」的案例 (下圖當中綠色的部分就是 GeForce3 有大改變的部分)。

asm8055

這樣的尷尬情況大約要等到 2001 年 10 月 NVIDIA 重新規劃 GeForce 家族,以 GeForce Ti 為名將整個家族的階級分別整個砍掉重練才有所好轉,新的 GeForce Ti 家族包含針對頂級市場推出的 GeForce3 Ti 500、對應中高階市場的 GeForce3 Ti 200 與目標為低階入門市場的 GeForce2 Ti (比 GeForce2 Ultra 還要略差一點的型號,處理能力大致相同,但記憶體頻寬降到 GeForce2 Pro 等級) 三種 (在這個時期裡 Ti 是「最高 CP 值」的象徵,並不是如同目前 GeForce GTX980 Ti 中的 Ti 代表「強化高級版本」的意思)

avk8096

面向頂級市場的 GeForce3 Ti 500 實際上是 GeForce3 的時脈提升版本,運作時脈從原本的 200/460 MHz 大幅提高到 240/500 MHz,直到這之後 GeForce3 的性能表現才真正具有競爭力 (畢竟是當家旗艦,新科旗艦居然打不過上代王牌說真的很難看),至於面向主流市場的 GeForce3 Ti 200 則是「GeForce3 的降頻版本」,價格上比 GeForce3 還要略低,但是性能基本上經常輸給 GeForce2 Ultra,甚至在對上 GeForce2 Ti 時也是如此,並沒有太大的可看性,設計這款型號的主要目的大概只是為了加快可程式化管線與 DirectX 8.0 的普及吧?

至於為什麼 NVIDIA 不比照 GeForce2 時代的做法推出 GeForce3 MX 來擔當主流與入門市場的主角呢,其實不是「不想」,是技術上還「做不到」,當年由於 GeForce3 第一次導入許多全新的架構設計,因此在良率上的表現一直都不夠理想,反映在成本上之後自然導致 NVIDIA 實際上很難以足夠低的成本來設計出低階入門版本的 GeForce3 MX,畢竟賠錢的生意沒人肯做的。