Shader編程學習筆記(二)—— Shader和渲染管線

來源:互聯網
上載者:User

標籤:

Shader和渲染管線

 

什麼是Shader

  Shader,中文翻譯即著色器,是一種較為短小的程式片段,用於告訴圖形硬體如何計算和輸出映像,過去由組合語言來編寫,現在也可以使用進階語言來編寫。一句話概括:Shader是可程式化圖形管線的演算法片段。
  它主要分為兩類:Vertex Shader和Fragment Shader。

 

什麼是渲染管線

  渲染管線也稱為渲染流水線,是顯示晶片內部處理圖形訊號相互獨立的平行處理單元。一個流水線是一序列可以並行和按照固定順序進行的階段。就像一個在同一時間內,不同階段不同的汽車一起製造的裝配線,傳統的圖形硬體流水線以流水的方式處理大量的頂點、幾何圖元和片段。

  注意理解的是這裡有一個前後關係,前一個階段的輸入會到後一個階段去輸出。比如在頂點程式當中,頂點程式計算的資料就會作為片段程式再進一步加工的材料。

  為了更形象地理解渲染管線,來看一下下面的插圖。

  最上面的是【3D應用或者遊戲】,【3D應用或者遊戲】會直接調用【3D應用介面】,也就是OpenGL或者DirectX等。OpenGL和DirectX是方便應用程式去進行硬體訪問和調用的中介層。如果沒有它們,我們需要為硬體去編寫一個非常複雜的專門針對硬體的驅動程式。
  再接下來就是【CPU和GPU的分界線】,在此之上都是CPU的操作,以下進行GPU運算。
  GPU的運算是從左至右依次進行,最開始【GPU前端模組】到【圖元裝配】這中間如果在過去T&L流水線的過程當中是由硬體設計好的運算過程,也就是整合的,它不能夠進行編程式控制制。當圖形硬體具有了可程式化能力之後,我們就可以在這個階段使用【頂點著色器】進行編寫運算邏輯,用於取代過去直接整合在硬體當中的運算。在這個階段完成之後,會到【光柵化以及插值】階段。
  光柵化就是把電腦顯卡當中運算的資料進行一個細分,用於去適配螢幕上具體的每一個像素的顯示,但是光柵化並不等同於像素顯示,像素顯示最終反映的是顏色,而光柵化過後得到的結果是【幀緩衝】,在這個過程當中,我們可以插入【片段著色器】,這個部分就可以使用可程式化化運算。所以【片段著色器】的目標是為螢幕上最終要顯示的每一個像素去計算它最後需要什麼樣的顏色。

  對於Unity來說,以上過程可以通過來解釋。

  最上面【Geometry】是幾何模型,幾何模型進入【Unity】,可以理解為把幾何模型Mesh、網格等資料交給Unity,Unity匯入後就通過Unity引擎去調用【Grphics APU】圖形API,調用圖形API的過程就是在驅動GPU進行處理運算。
  進入GPU運算首先進行的是【Vertex Processor】頂點處理器,這個部分就需要我們使用【Vertex Shader】頂點著色器,頂點著色器運算的結果會交給【Pixel Processor】像素處理器,也就是片段處理器,在這個部分我需要為像素處理編寫【Pixel Shader】像素著色器程式,這部分計算完後就輸出了最終我們可以用於在螢幕上的顏色資訊,我們把它叫做【Frame Buffer】幀緩衝。幀緩衝儲存的是電腦依次顯示所要的資料,但也不僅僅是這些資料,它還有其他的附加資訊,比如深度值等。

  下面是Unity官方手冊中的一張渲染管線圖示。

  渲染管道線中最左邊的這個部分中Transform指的是模型的空間變換,主要針對的是頂點的空間幾何變換;TexGen即Texture Generator,表示的是紋理座標的產生,主要用於在頂點當中去取得紋理座標,再轉換為UV取值的範圍;Lighting指的是光照。因此這個部分就是過去就是T&L幾何變換光照流水線,當圖形硬體具有了可程式化能力後,這個固定的模組就被【Vertex Shader】頂點著色器代替了。

  在頂點著色器處理過後,Unity就進入【Culling & Depth Test】裁剪和深度測試過程。裁剪和深度測試描述的是如果一個物體在攝像機前展示,它向著攝像機的面會被觀察到,它背對著攝像機的面不會被觀察到,在這樣的情況下,為了減少GPU處理資料量就進行了一個裁剪(Culling),把看不見的面直接剔除,不需要去處理的這些面所涉及的頂點資料,從而加速圖形處理。第二個方面深度測試(Depth Test),指的是攝像機有一個特性,在電腦當中沒有無限這個概念,電腦處理的資料都是離散化的,它有一個範圍,當超過最近和最遠這個範圍的這部分會被剔除。

  接下來就進入到紋理採樣(Texturing)和霧化處理(Fog)階段。在這階段實際上就是在進行光柵化處理,描述的就是如何在螢幕上顯示每一個像素的顏色。這裡需要去紋理採樣,一張貼圖有很多資料,我們去採集紋理上某一點的顏色值,這個就叫做紋理採樣。霧化就是根據最後計算的資料後需不需要進行一個霧化處理,近處的很清晰,遠處的有種朦朧感,這個部分就是片段著色器可程式化的能力範圍。

  之後還需要【Alpha Test】,指的是去繪製那些半透明的或全透明的物體。經過【Alpha Test】之後還需要進行【Blending】處理,這階段會混合最終的映像。

  以上介紹的是渲染管線的流程,要把握的主要的過程就是我們可程式化能力是兩個部分,一個就是幾何變換和光照使用的頂點著色器部分,另一個就是關於如何去採樣,去計算顏色以及霧化處理等使用的片段著色器部分。

  這裡需要注意的是Unity最佳化當中有一個主要部分就是減少Draw Call的調用,Draw Call就指的是應用程式去調用圖形硬體GPU去進行渲染的調度過程。應用程式需要準備很多的資料,包括頂點資料、矩陣、向量等資料,都需要通過應用程式傳遞給GPU,這樣個調度過程CPU必須要去收集資料以後才產生一個API的調用,這個過程的消耗是高昂的,如果反覆地啟動這個調用,那麼就僅僅收集和傳遞參數這樣的過程相當耗時耗力,就會造成了應用程式或遊戲啟動並執行瓶頸。因此要盡量減少Draw Call,盡量減少CPU對GPU這樣的調用。

 

Shader和材質、貼圖的關係

  Shader(著色器)實際上就是一小段程式,它負責將輸入的頂點資料以指定的方式和輸入的貼圖或者顏色等組合起來,然後輸出。繪圖單元可以依據這個輸出來將映像繪製到螢幕上。輸入的貼圖或者顏色等,加上對應的Shader,以及對Shader的特定的參數設定,將這些內容(Shader及輸入參數)打包儲存在一起,得到的就是一個Material(材質),之後,我們便可以將材質賦予三維物體來進行渲染(輸出)了。

  材質好比引擎最終使用的商品,Shader好比是生產這種商品的加工方法,而貼圖就是原材料。

 

總結

  Shader是圖形可程式化方案的程式片段。主要分為頂點著色器和片段著色器。

  渲染管線是一種電腦從資料到最終圖形成像的形象描述。

  材質可以理解為商品,Shader是加工這種商品的方法,而貼圖是加工過程中需要的材料。

Shader編程學習筆記(二)—— Shader和渲染管線

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.