啥玩意是渲染?
遊戲圖像的繪制被稱為渲染
啥玩意是渲染管線?
表示繪制到遊戲視圖的過程中,壹個模型文件的數據經過了哪些轉換步驟
通常指的是GPU流水線,不包含CPU部分
CPU主要是準備好頂點、貼圖、法線、燈光方向、顏色等東西之後,告訴GPU
GPU接收到數據後,就要對其處理最終顯示到屏幕上
因為屏幕是2D畫面,模型是3D資源,必然有壹部操作,就是將3D轉化為2D。
這個操作之前被稱為頂點階段(幾何階段),主要是處理3D模型數據
之後被稱為片元階段(光柵化階段),處理2D像素數據
1.頂點著色器(Vertex Shader)
如下所示:
每個頂點都會調用壹次這個函數,並轉化為這個函數的輸出,這些輸出被稱為圖元(Primitive)
壹般可以在這裏改變頂點或者法線相關信息
2.曲面細分(Tessellation Shader)
是OpenGL 4.0新加入的特性,很多設備還不支持
主要的作用是可以優化曲面,eg:使曲面更平滑
3.幾何著色器(Gemoetry Shader)
幾何著色器的輸入輸出都是圖元(Primitive),不是頂點
可以將簡單的圖元擴展成更為復雜的形式
4.變化回執(Transform Feedback)
是在OpenGL 3.0之後加入的特性
可以將圖元存放到 Transform Feedback Buffer中,並可以決定是否按照先前的流程光柵化
主要特性:在下壹幀渲染時,可以得到上壹幀圖元的數據,對於定量變化的情況,可以節省掉流水線之前的步驟
(常被用於粒子系統 or 角色的頭發)
5.裁剪(Clipping)
圖元會根據視域的平截頭體(Frustums)做可見性判斷
區域外的定點會被舍棄,與這個定點連線的三角形的邊會與平截體求交點,這些交點就變成裁剪後的新頂點
6.屏幕映射(Screen Transform)
圖元的坐標從齊次裁剪空間變換到屏幕空間
7.圖元裝配(Primitive Assembly)
頂點會被轉化成基礎圖元,供後續步驟使用
三角形的朝向剔除(Face Culling)是在這個階段完成的
8.光柵化(Rasterization)
三角形會經歷兩個步驟:
1.三角形會被轉化成片段
2.會遍歷三角形,獲取頂點屬性進行插值,在每個像素點上產生壹個插值
如果開啟了多重采樣抗鋸齒(Multisample Antialiasing,MSAA),此處就會對每個像素進行多次采樣,產生多個偏遠,最後在混合,以達到抗鋸齒的效果
9.提前深度測試(Early Depth Test)
檢查片元的深度,如果不需要顯示則丟棄它
可以在片元著色器運行之前去掉不合理的值,減少運算的消耗
但是 與後續的透明測試有沖突 ,如果在後續的透明度測試中失敗,這步深度測試也不應該將其通過
有些GPU會判斷是否有此類沖突,如果有就跳過(有壹定消耗)
10.片元著色器(Fragment Shader)
可以自定義光照計算、讀取貼圖顏色、設置透明度等
輸入是光柵化後得到的片元數據,輸出值也為片元數據
Unity中會把函數返回值寫為運算後的顏色
11.逐片元操作(Pre-Sample Operation)
這個階段:主要是先測試後混合
測試***經歷了4個測試:
他們的作用都是確定壹個像素是否應該顯示
1.裁切測試(Scissor Test)
通過區域判斷的,與基於頂點的 Clipping 階段不同
2.透明測試(Alpha Test)
透明度達不到,就不繪制
3.模板測試(Stencil Test)
通過緩沖區來進行像素比較,與ColorBuffer或DepthBUffer,StencilBuffer是壹個8位圖像,每個像素保存壹個無符號整型
4.深度測試(Depth Test)
通過深度緩沖區的比較,判斷是否應該繪制像素
需要先制定深度寫入規則,然後再指定比較規則
分別對應Unity的 ZWrtie 和 ZTest
(深度寫入不透明物體默認打開,透明物體默認關閉,測試方法默認是小於等於)
混合階段主要有2個階段:
1.混合(Blending)
通過測試的顏色與ColorBuffer中顏色的疊加方式
混合有多種疊加方式,壹般會使用RGBA的值作為計算因子,采用插值的方式進行線性計算
2.寫入遮罩(Write Mask)
主要是顏色遮罩(Color Mask),在最終繪制時,對顏色進行過濾
so,
經過上面所有的步驟後,最終這個像素會被繪制到顏色緩沖區,並被顯示到屏幕上