unity繪製管道 Unity 之渲染管線初探

2021-10-17 02:53:13 字數 1786 閱讀 1436

unity 是一款跨平台的 3d 引擎,有著強大的渲染功能,並主要用於遊戲開發。

談到 unity 的渲染功能,我們不得不提及到著色器(shader)——3d 遊戲引擎中最重要的乙個因素­,它在遊戲效果以及畫面顯示方面起到了決定性的作用。shader 程式設計也屬於計算機圖形學中乙個重要的部分。

接下來讓我們從可程式設計渲染管線來了解 shader 程式設計。

渲染管線模型

3d 遊戲以及 3d 模型通過渲染管線來渲染到 2d 的螢幕上。渲染管線的流程是在 gpu 中進行的,它主要占有計算機的視訊記憶體部分。渲染管線在這個過程中進行了頂點處理、面處理、光柵化、畫素處理。

1)頂點處理

大多數接觸過 3d 圖形的人都知道3d 模型是通過眾多點構成的面而展現出來的。

頂點處理,是通過一系列座標系的變換,讓各個頂點通過一定的規律在攝像機前位移,最終在螢幕上對應這些頂點的過程。

首先,物體的各個頂點從自身座標系,通過世界變換矩陣處理轉換到世界座標系,再通過取景變換矩陣變換到觀察者座標系,最後通過投影變換,將頂點轉移到螢幕座標系。

有一點大家會經常忘記,在觀察者座標系轉換到投影座標系的過程中,gpu(圖形處理單元)還對材質屬性和光照屬性進行了處理。

2)面處理

三點成一面。面處理有三個部分:面的組裝、面的擷取、面的剔除。

面的組裝:模型中的三個點會組成乙個三角形的面(非任意點,因為每個點都有自己的編號)。這些面,面面相接,組成了我們能看到的模型。

面的擷取:由於攝像機和人眼一樣,可視的區域是乙個錐形,模型在攝像機可視範圍內可能並不是全覆蓋,也就是在攝像機外,這些在攝像機之內的部分就會被擷取。

面的剔除:為了模擬肉眼,攝像機前的物體會出現近大遠小的現象,那麼物體和物體之間會有遮擋,被遮擋的面會被剔除不處理;每個面都有法向量,所以只有在面的法向量和攝像機散射向量夾角大於90度的才會被攝像機捕捉到。

3)光柵化

光柵化,又稱之合併階段。它的主要功能是將麵轉換成一幀中的畫素集合。

這一階段是不可以程式設計的,它負責執行多個片段測試,包括:深度測試、alpha 測試和模板測試,程式設計師可以通過高度配置來實現想要的效果。如果通過了所有的測試,這部分顏色就會與幀緩衝儲存的顏色通過 alpha 混合函式進行合併。

4)畫素處理

這個階段將畫素區域著色,然後賦予貼圖。

(左上為3d網格模型,左下為賦予貼圖後的3d模型,右圖為貼圖)

shader 詳解

介紹完gpu 渲染管線之後,我們再來簡單了解一下可程式設計著色器 shader —— 圖形渲染裡最有趣的部分。shader 能讓渲染的圖形展示出水面效果、火焰的熱流效果、角色的虛化效果等視覺效果。

著色器可分為頂點著色器(vertexshader)、幾何著色器(geometry shader)和畫素著色器(pixel shader)。它們從輸入的資料中取得乙個元素,通過程式計算,變換為輸出資料的乙個或多個元素。

頂點著色器輸入源為頂點,頂點包含其在自身座標系或世界座標系的位置和向量資訊,而輸出源為已通過變換和照明處理的頂點,包含其投影座標系的資訊。

幾何著色器的輸入源為乙個有 n 個頂點的幾何圖元以及最多 n 個作為控制點的額外頂點,輸出源則變成 0 或多個圖元。根據效果需要,這些圖元的可能和輸入的時候不同。

畫素著色器輸入為頂點間的片段,這些片段所包含的資訊來自於對三角形頂點資訊的插值,輸出成將要寫到幀緩衝裡的顏色。

結語在遊戲中,絢麗的場景和角色是怎麼來的呢? 很簡單,紋理資料以紋理座標(uv 座標)定址的,而並非記憶體位址。通過著色器我們可以直接讀取紋理貼圖。

模型的頂點和紋理內的 uv 座標一一對應,這樣,紋理就以一定的規則貼在了模型上。

以上就是對渲染管線的簡單介紹,關於著色器語法且待下回分解。

Unity繪製戶型(一)

戶型繪製主要物件資料 點 線 面 部件 門窗 主要難點是通過繪製的點尋找閉合多邊形 多邊形的生成 3d牆體的生成 門窗要在牆體上留下孔洞這四個功能。這篇文章我只寫前兩個問題,後面來兩個問題單獨再寫一篇文章。1.如何尋找閉合多邊形?我的方法是遍歷全部的點,剔除不參與構面計算的點。不參與構面計算的意思是...

unity 調色盤之shader繪製

最近閒來無事,給自己找點麻煩,用shader做乙個調色盤,分享給大家 繪製 中心思想是通過uv座標,計算出每個象素的顏色值 左側方志顏色計算公式 i.uv.y color.r i.uv.y 1 i.uv.x 1 color.r i.uv.y color.g i.uv.y 1 i.uv.x 1 col...

關於Unity 動畫繪製原理

動畫繪製的原理 現在螢幕中確定動畫的顯示區域,然後將動畫中的每一幀按固定的時間在這個區域中按順序切換,從而實現動畫的效果。建立資料夾textures private var anim object 動畫陣列 private var nowfram int 幀序列 private var mframe...