早期的顯卡是用來“顯示東西的卡”,繪圖工作全部是由 CPU 來完成的.顯卡的工作就是把 CPU 處理好的資料“搬”到顯示器上來。CPU的工作量十分大,隨著圖像質素要求的提高,就出現了圖形加速的需求。
圖形加速的幾個階段:2D 圖像加速,Windows 加速和 3D 圖像加速。
重點講一下3D圖像加速。
3D 圖形處理需要經過的 4 個階段
一、幾何變換(Transform)
大家知道,3D 物體是由三角形組成的。每個三角形呢,有三個頂點。而只要把這三個頂點的位置移動了,那麼這個三角形也就自然跟著移動了。所以,幾何變換所對應的處理物件就是頂點(Vertex)。大家想一想,一個物體在 3D 空間能做哪些動作呢?最基本的應該有:平移,旋轉,縮放,扭曲,投影等等… 具體的過程以及運算呢,學過線性代數的朋友應該很清楚,大家只需要把幾何變換看成一個黑盒子,左面輸入未經處理的頂點,右邊輸出處理好的頂點。具體的過程,大家可以在網上查找一下矩陣(Matrix) 的操作。
矩陣具有特殊的性質,它可以把通過相乘把所有的變換組合成一個單一的矩陣。也就是說,比如 T1 是平移,T2 是旋轉,T3 是縮放,那麼 T’ = T3 * T2 * T1。這樣,T’ 就是把一個物體先平移,然後旋轉,最後縮放的矩陣。這個特性非常的重要,它為電腦圖形處理節省了大量的工作。在幾何變換之後,還有一個工作要做,那就是裁剪。簡單的說,裁剪就是把物體落在螢幕外面的部分去掉,這樣就不需要處理看不到的東西,從而節省了處理量。
二、3D圖形學的光照
三、設定(Setup)
這個過程比較簡單,而且很死板。所以即使最新的 GPU 也不把這個功能開放給程式師,而是固定的完成的。就是,給了三角形的三個頂點,經過幾何變換,裁剪和光照的三個點,把它們落在螢幕上的位置給找出來,當找到位置時候,就可以進行下一步 ---- 填充這個三角形了。這下一個過程,就是傳說中的 Pixel Shader 的重頭戲: :rolleyes:
四、光柵化(Rasterize)
找到了三角形在螢幕上的位置,也就是圖元群,我們就可以開始把它畫出來了。
基本的工作有三個:一個就是按照貼圖座標(Again…) 去紋理貼圖裏讀到顏色資料(Texture Reading)。
第二個是把讀到的資料和前面算好的光照強度進行一系列的運算,得到這個圖元的顏色(Texture Blending)。
而第三個,就是把它和螢幕上當前圖元的顏色進行一定的處理,然後畫到這個圖元上(Alpha Blending)。
在以往的顯卡裏,這三個過程是固定而順序進行的,也就是說,顯卡先用前面的週期讀取紋理貼圖資料,在以預先設定好的方法之一進行貼圖的混合,最後同樣用預先設定好的方法把新的顏色和螢幕當前圖元的顏色混合起來,最後寫到螢幕上。而按照這種方法,給顯卡的圖元渲染管線配備一個以上的貼圖單元,就可以成倍的提高第一個過程的速度。
比如著名的 GeForce 4 Ti 系列顯卡,它的每條圖元渲染管線配備了兩個貼圖單元,這樣,當三角形要用到兩層貼圖的話,GeForce 4 Ti 在一個週期內就可以把兩張紋理貼圖的資料都讀取到,而相反 Radeon 9000 系列顯卡因為只有一個貼圖單元,所以要花兩個時鐘週期才能讀到兩層紋理貼圖資料。事實也是這樣的,GeForce 4 Ti 系列顯卡在運行現有的多貼圖的遊戲時,速度非常的快。
而自從 GPU 誕生以來,可編程的流水線的靈活性就被完美的顯現了出來。用來處理圖元的單元,在 DirectX 裏叫做 Pixel Shader 單元。但是為了兼顧以前的顯卡架構,Pixel Shader 的第一個版本 1.x 在制定的時候,需要 Shader 代碼還是按照傳統的流程執行,也就是貼圖讀取在先,貼圖混合在後,最後顏色混合。這樣靈活度還是很低的。
在 Pixel Shader 第二個版本,也就是 2.0 的制定過程中,人們意識到了靈活的重要性,所以第二版本的 Shader 將可以把貼圖讀取和顏色混合過程混起來執行。其中的一個例子就是:環境反射貼圖。它的計算過程是這樣的:從第一張貼圖裏讀取頂點法線的偏移量,對當前的法線進行偏移,然後用偏移後的法線來讀取第二張貼圖。大家都能看出來,在兩次貼圖讀取之間,有運算的過程。這樣用 Pixel Shader 2.0 寫起來很方面,可是 Pixel Shader 1.1 就是很困難的事情了,即使能實現,整個過程也顯得很不透明。
在上面的情況下,流水線的第二個貼圖單元會被浪費,因為讀取這兩張貼圖,同樣花了兩個週期,第二個貼圖單元沒能起到加速處理的功能。在這個前提下,例如 Radeon 9700 的設計就體現出了靈活的方式,它只用一個貼圖單元,卻有兩倍於上代顯卡的圖元處理流水線,能在保持性能的前提下,儘量減少不必要的電晶體浪費。
來總結一下:頂點進入顯卡的處理管道 => 幾何變換 => 光照 => (裁剪 =>) 設定 => 光柵化 => 螢幕上的圖元怎麼樣,是不是直觀明瞭?
沒有留言:
張貼留言