Real-Rime Rendering (10) - 圖形硬件及學習小結(Graphics Hardware)

提要

       時代在變,硬件也在變,但一些基本的架構其實根本未變,就像計算機發展了這麼多年,還是逃不了幾百年前圖靈機所定下的:存儲器;控制器;運算器,輸入設備和輸出設備。圖形硬件也有自己的套路。


流處理器和ROPs

通常我們在選購顯卡的時候,常常會注意顯存,位寬什麼的,但時常會忽略最重要的參數:流處理器和ROPs。

  在傳統顯卡的管線架構中,我們經常說道某張顯卡擁有X條渲染管線和X個頂點着色單元。而像素渲染管線又稱像素渲染流水線,這個稱呼能夠很生動的說明像素渲染流水線的工作流程。我們對於一條流水線定義是“Pixel Shader(像素着色器)+TMU(紋理單元)+ROP(光柵化引擎,ATI將其稱爲Render Back End)。

        ROPs(光柵化處理單元)主要負責遊戲中的光線和反射運算,兼顧AA、高分辨率、煙霧、火焰等效果。遊戲裏的AA(抗鋸齒)和光影效果越厲害,對ROPs(光柵化處理單元)的性能要求也就越高,否則就可能導致遊戲幀數急劇下降.比如同樣是某個遊戲的最高畫質效果,8個光柵單元的顯卡可能只能跑25幀.而16個光柵單元的顯卡則可以穩定在35幀以上。舉一個例子:GTX550Ti和HD6790前者是24個ROPs單元,後者是16個ROPs單元,雖然在大部分測試項目中,HD6790都是領先GTX550Ti的,但是在高AA(抗鋸齒)負載的情況下,HD6790的弱點即刻暴露出來,16個ROPs單元顯得有點力不從心。從FarCry 2中也印證出了這一點:遊戲中4xAA設置下HD 6790的落後幅度爲4%左右,而開啓8xAA後性能落後幅度則擴大至15-17%之多。

         需要注意的是,AMD顯卡和NVIDIA顯卡在ROPs的設計上是有區別的,N卡的ROPs單元和流處理器是“捆綁”的,即置於SIMD之內,所以倘若消減N卡的流處理數量,其ROPs單元也隨之消減;而A卡則不一樣,其ROPs單元和流處理器單元是沒有關聯的。


        傳統管線架構:以往顯卡由頂點渲染管線和像素渲染管線組成,生成圖像的過程都是先由頂點渲染管線中的Vertex Shader(頂點着色器)生成基礎的幾何圖形骨架(由三角形構成),然後再由像素渲染管線中的Pixel Shader(像素着色器)進行填色,最後纔是像素渲染管線中的紋理單元進行貼圖。而當新的統一渲染架構提出之後,頂點着色器和像素着色器被合二爲一,成爲流處理器(Shaders),它將同時負責頂點着色和像素着色,避免了負載不均衡的情況發生。最先提出統一渲染架構的是微軟的DirectX 10。

     

          需要說明的是,N卡和A卡的所採取的核心架構是不一樣的,N卡採用的是MIMD架構。多指令流多數據流(MultipleInstructionStreamMultipleDataStream,簡稱MIMD),它使用多個控制器來異步地控制多個處理器,從而實現空間上的並行性,所以N卡是一個發射器;A卡採用的是SIMD架構設計,即Single Instruction Multiple Data(單指令流多數據流),A卡是將4個簡單指令+1個複雜指令打包,再用一個發射器發出。所以A/N兩者不能進行流處理器數量的簡單對比。


Buffers and Buffering 緩衝區和緩衝

        我們知道顏色和像素的值都是存在顏色buffer中的,然後通過加載buffer把圖形顯示在屏幕上。幀buffer可能是放在內存中,也可能是放在顯存中。color buffer是frame buffer

的一部分,然後和frame buffer 和 video conntroller像連接,video controller負責將frame Buffer 輸出到各種顯示器上,video controller 通常能夠把數字信號轉換成模擬信號,CRT顯示器屬於模擬設備,需要模擬信號作爲輸入,LCD顯示器屬於數字設備,需要數字信號作爲輸入,但模擬信號通常也可以使用。


       刷新頻率

        對於CRT來講,屏幕上的圖形圖像是由一個個因電子束擊打而發光的熒光點組成,由於顯像管內熒光粉受到電子束擊打後發光的時間很短,所以電子束必須不斷擊打熒光粉使其持續發光。電子槍從屏幕的左上角的第一行(行的多少根據顯示器當時的分辨率所決定,比如800X600分辨率下,電子槍就要掃描600行)開始,從左至右逐行掃描,第一行掃描完後再從第二行的最左端開始至第二行的最右端,一直到掃描完整個屏幕後再從屏幕的左上角開始,這時就完成了一次對屏幕的刷新,周而復始。這樣我們就能夠理解,爲什麼顯示器的分辨率越高,其所能達到的刷新率最大值就越低。一般來講,屏幕的刷新率要達到75HZ以上,人眼纔不易感覺出屏幕的閃爍,CRT顯示器的刷新率是由其行頻和當時的分辨率決定的,行頻越高,同一分辨率下的刷新率就越高;而行頻一定的情況下,分辨率越高則它所能達到的刷新率越低。 


  對於LCD來說則不存在刷新率的問題,它根本就不需要刷新。因爲LCD中每個像素都在持續不斷地發光,直到不發光的電壓改變並被送到控制器中,所以LCD不會有“不斷充放電”而引起的閃爍現象。

      Color Buffer

      根據表示顏色所用的字節數, color buffer 通常分爲不同的顏色模式:

High color:每個像素用兩個字節來表示,用15或16個bit來表示顏色,一共可以表示 32768或者65536種顏色。

True color/RGB color: 每個像素3-4個字節來表示,則有24bit可以用來表示顏色,有168萬種不同的顏色。

       在High color中,每5個bit表示red/green/blue。剩下的一個字節用來表示alpha或者加到綠色的通道中。因爲綠色對於人眼的影響最大。而且綠色的顏色不連續會非常明顯。



       在True color/RGB color中,一個字節表示一個顏色,用4個字節來表示可以有加速存儲的效果。還有的系統會拿出8bit來存儲alpha通道,也就是傳說中的RGBA表示。還有用24bit來表示RGB的,沒有alpha通道,這樣可以節省內存。

       

深度緩衝 Z-bufffering

       深度衝突(z-fighting)指的是場景中兩個z-buffer相同的圖元出現閃爍的現象。

       深度緩衝是在三維圖形中處理圖像深度座標的過程,這個過程通常在硬件中完成,它也可以在軟件中完成,它是可見性問題的一個解決方法。可見性問題是確定渲染場景中哪部分可見、哪部分不可見的問題。畫家算法是另外一種常用的方法,儘管效率較低,但是也可以處理透明場景元素。深度緩衝也稱爲 Z 緩衝。
       當三維圖形卡渲染物體的時候,每一個所生成的像素的深度(即 z 座標)就保存在一個緩衝區中。這個緩衝區叫作 z 緩衝區或者深度緩衝區,這個緩衝區通常組織成一個保存每個屏幕像素深度的 x-y 二維數組。如果場景中的另外一個物體也在同一個像素生成渲染結果,那麼圖形處理卡就會比較二者的深度,並且保留距離觀察者較近的物體。然後這個所保留的物體點深度保存到深度緩衝區中。最後,圖形卡就可以根據深度緩衝區正確地生成通常的深度感知效果:較近的物體遮擋較遠的物體。這個過程叫作 z 消隱。
       深度緩衝的分辨率對於場景質量有很大的影響:當兩個物體非常接近的時候,16 位的深度緩衝區可能會導致“z -fighting”的人爲噪聲;使用 24 位或者 32 位的深度緩衝區就會表現得較好;由於精度太低,所以很少使用 8 位的深度緩衝區。


模板緩衝 Stencil Buffer

        與顏色緩衝區和深度緩衝區類似,模板緩衝區可以爲屏幕上的每個像素點保存一個無符號整數值。這個值的具體意義視程序的具體應用而定。在渲染的過程中,可以用這個值與一個預先設定的參考值相比較,根據比較的結果來決定是否更新相應的像素點的顏色值。這個比較的過程被稱爲模板測試。模板測試發生在透明度測試(alpha test)之後,深度測試(depth test)之前。如果模板測試通過,則相應的像素點更新,否則不更新。圖形渲染管線中,基於單個像素的測試操作的順序如下圖。

        

        在模板測試的過程中,可以先使用一個比較用掩碼(comparison mask)與模板緩衝區中的值進行位與運算,再與參考值進行比較,從而實現對模板緩衝區中的值的某一位上的置位狀態的判斷。這樣,模板緩衝區中的值不僅可以作爲一個獨立的整體使用,還可以作爲一個比特集合使用。

緩衝內存 Buffer Memory

       這裏用一個簡單的計算的例子來說明。

       假如屏幕在真色彩模式下顯示一個1280*1024的圖像,每個顏色通道用8位來表示,RGBA,一共四個字節,那麼現實整個圖片需要的空間是1280*1024*4 = 5MB。使用雙緩衝技術,則空間翻倍10MB,再用24位的深度緩衝,8位的模板緩衝區,現在佔用的空間是15MB, 如果還要用到一些抗鋸齒的處理,比如說超級採樣(SuperSampling)或者多重採樣(multiSampling),需要的存儲空間會更多。


Real time rendering 學習小節

          話說我一直認爲一個專題至少要寫10篇博客纔算是有一點自己的東西。

          終於終於把這本圖形學聖經好好地啃了一遍,雖說不上大徹大悟,但受益匪淺是絕對的。

          書的質量肯定沒話說,從最開始的渲染流水線到最後的圖形硬件,每一章都非常有深度,適合有一定圖形學基礎的同學好好看一看。而整個看書的過程是蠻艱難的,一個是英語,一個是時間。相信現在很少有人能夠安安心心去啃一本英語原版的純理論書,我也是一邊查單詞一邊看,然後一邊做筆記,最後再整理到這裏。認認真真看一章書最少需要一天的時間,這裏還不包括寫代碼去實現。而來到A城實習之後,很少有大塊的時間自由支配,之間有一段空了很久沒有動這本書了,一方面是時間,一方面也書有點難。

          其實到現在光照那一塊看得還是有點迷糊。   

          好在最後還是堅持了下來。

         還有,非常感謝師姐對書中疑問的解答.

          ...

          有時候會覺得浪費了很多時間,不如去把C++或者算法學好來得實在之類的,對找工作會更有用。

         But!人生最重要的就是這個BUT!

         我就是喜歡圖形,我就是喜歡炫酷的東西,我就是要做遊戲,

         那麼,就去幹好了。


參考

大忽悠JS將失效 顯卡帝詳解顯卡全參數 - http://vga.zol.com.cn/227/2279098.html

菜鳥充電:幫你認識常見的顯卡基本參數 - http://diy.pconline.com.cn/graphics/study_gra/0710/1121331_all.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章