Shader學習(二)

unity 中繪製屏幕要將每個物體從自己所屬的物體空間依次經過世界空間,攝像機空間,裁剪空間,標準設備空間進行變換,最終到達實際窗口空間。整個渲染過程分爲應用階段、幾何階段、光柵化階段:
應用階段 輸出 渲染圖元 給 幾何階段
幾何階段 輸出 屏幕空間的頂點信息 給 光柵化階段
1. 應用階段
通常由cpu負責實現,
把數據加載到顯存
設置好每個模型的渲染狀態,
調用DrawCall

DrawCall是一個命令,發起方是CPU, 接收方是GPU, 從cpu到gpu的一個過程就一個drawcall
這個命令僅僅指向一個需要被渲染的圖元(primitives)列表,而不會再包含任何材質信息。收到Drawcall命令後,GPU會根據渲染狀態(如材質、紋理、着色器等)和所有輸入的頂點數據來進行計算,最終輸入到屏幕上的像素。

  1. 幾何階段
    通常由GPU負責實現。
    負責和每個渲染元打交道,進行逐定點,逐多邊形的操作。
    把頂點座標變換到屏幕空間中,再交給光柵器處理。輸出屏幕空間的二維定點座標,每個定點對應的深度值 着色等相關信息
  2. 光柵化階段
    使用上個階段傳遞的數據來產生屏幕上的像素。並渲染最終的圖像。
    在GPU上運行
    需要對上一個階段得到的逐定點數據進行插值,然後再進行逐像素處理

幾何階段和光柵化階段流程

頂點着色器:實現頂點空間的變換,逐頂點光照、輸出後續階段所需數據等功能。不可以創建、銷燬頂點,無法得到頂點之間的關係,各個頂點相互獨立,(每個頂點會調用一次頂點着色器)

曲面細分着色器:細分圖元。

幾何着色器:執行逐圖元的着色操作,或被用於產生更多的圖元。

裁剪:完全在攝像機視野的傳遞下階段,完全不在攝像機視野的移除,部分在攝像機視野的進行裁剪。(裁剪過程是硬件上的固定操作,不可以編程控制該過程,但可以配置裁剪方式)

屏幕映射:把圖元座標轉換到屏幕座標系中。

三角形設置:計算光柵化一個三角形網格所需的信息。獲得整個三角網格像素的覆蓋情況,計算每條邊上的像素座標。 爲了能夠計算邊界像素的座標信息,需要三角形邊界的表示方式。這個過程就叫三角形設置。
三角形遍歷:會檢查每個像素是否被一個三角網格所覆蓋,如果覆蓋,就會生成一個片元(Fragment)。這樣一個找到那些像素被三角形所覆蓋的過程就是三角形遍歷。這個過程輸出一個片元序列。一個片元並不是真正意義上的像素,而是包含了很多狀態的幾何。這些狀態(屏幕座標、深度信息、以及幾何階段輸出的頂點信息、如法線、紋理座標等)用於計算每個像素的最終顏色。

片元着色器:實現逐片元的着色操作。(一個像素可以包含多個片元,一個片元可以覆蓋多個像素)
片元是對三個頂點的信息進行插值得到的。片元着色器在directx被稱爲像素着色器。 片元着色器的輸入是上一個階段對頂點信息插值得到的結果。其中最重要的就是紋理採集。
逐片元操作
在directx中,成爲輸出合併階段。
逐片元操作階段負責一些重要操作,如修改顏色、深度緩衝、進行混合等

逐片元操作階段圖

模板測試:
GPU會首先讀取模板緩衝區中該片元位置的模板值,然後將該值和讀取(使用讀取掩碼)的參考值進行比較,如果片元沒有通過測試,該片元就會被捨棄。
深度測試
GPU把該片元和已經存在於深度緩存區中的深度值進行比較。
雙重緩衝
對場景的渲染是在後置緩衝,一旦場景已經渲染到了後置緩衝中,gpu就會交換後置緩衝區和前置緩衝區
混合是指是否將新的像素點直接覆蓋舊的像素點,導致透明像素也會覆蓋下方的像素

最後說下shader和material的關係
shader負責將輸入的mesh以指定的方式和輸入的貼圖或顏色等組合作用,然後輸出。繪圖單元可以根據這個輸出來將圖像繪製到屏幕上。輸入的貼圖或者顏色等,加上對應的shader,以及對shader的特定的參數設置,將這些內容打包存儲到一起,就得到material。將material賦予合適的renderer來進行渲染輸出
在cgprogram…endcg這樣一個代碼塊中,同樣是一段cg程序,要訪問在properties中所定義的變量,必須使用和之前變量相同的名字進行申明。
再次聲明sampler2D _mainTex就是再次聲明並連接了_MainTex使得接下來的cg程序能夠使用這個變量。

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