Unity 之渲染管線初探
Unity 是一款跨平臺的 3D 引擎,有著強大的渲染功能,並主要用於遊戲開發。
談到 Unity 的渲染功能,我們不得不提及到著色器(Shader)——3D 遊戲引擎中最重要的一個因素,它在遊戲效果以及畫面顯示方面起到了決定性的作用。Shader 程式設計也屬於計算機圖形學中一個重要的部分。
接下來讓我們從可程式設計渲染管線來了解 Shader 程式設計。
渲染管線模型
3D 遊戲以及 3D 模型通過渲染管線來渲染到 2D 的螢幕上。渲染管線的流程是在 GPU 中進行的,它主要佔有計算機的視訊記憶體部分。渲染管線在這個過程中進行了頂點處理、面處理、光柵化、畫素處理。
1)頂點處理
大多數接觸過 3D 圖形的人都知道3D 模型是通過眾多點構成的面而展現出來的。
頂點處理,是通過一系列座標系的變換,讓各個頂點通過一定的規律在攝像機前位移,最終在螢幕上對應這些頂點的過程。
首先,物體的各個頂點從自身座標系,通過世界變換矩陣處理轉換到世界座標系,再通過取景變換矩陣變換到觀察者座標系,最後通過投影變換,將頂點轉移到螢幕座標系。
有一點大家會經常忘記,在觀察者座標系轉換到投影座標系的過程中,GPU(圖形處理單元)還對材質屬性和光照屬性進行了處理。
2)面處理
三點成一面。面處理有三個部分:面的組裝、面的擷取、面的剔除。
面的組裝:模型中的三個點會組成一個三角形的面(非任意點,因為每個點都有自己的編號)。這些面,面面相接,組成了我們能看到的模型。
面的擷取:由於攝像機和人眼一樣,可視的區域是一個錐形,模型在攝像機可視範圍內可能並不是全覆蓋,也就是在攝像機外,這些在攝像機之內的部分就會被擷取。
面的剔除:為了模擬肉眼,攝像機前的物體會出現近大遠小的現象,那麼物體和物體之間會有遮擋,被遮擋的面會被剔除不處理;每個面都有法向量,所以只有在面的法向量和攝像機散射向量夾角大於90度的才會被攝像機捕捉到。
3)光柵化
光柵化,又稱之合併階段。它的主要功能是將面轉換成一幀中的畫素集合。
這一階段是不可以程式設計的,它負責執行多個片段測試,包括:深度測試、alpha 測試和模板測試,程式設計師可以通過高度配置來實現想要的效果。如果通過了所有的測試,這部分顏色就會與幀緩衝儲存的顏色通過 alpha 混合函式進行合併。
4)畫素處理
這個階段將畫素區域著色,然後賦予貼圖。
Shader 詳解
介紹完GPU 渲染管線之後,我們再來簡單瞭解一下可程式設計著色器 Shader —— 圖形渲染裡最有趣的部分。Shader 能讓渲染的圖形展示出水面效果、火焰的熱流效果、角色的虛化效果等視覺效果。
著色器可分為頂點著色器(VertexShader)、幾何著色器(Geometry Shader)和畫素著色器(Pixel Shader)。它們從輸入的資料中取得一個元素,通過程式計算,變換為輸出資料的一個或多個元素。
頂點著色器輸入源為頂點,頂點包含其在自身座標系或世界座標系的位置和向量資訊,而輸出源為已通過變換和照明處理的頂點,包含其投影座標系的資訊。
幾何著色器的輸入源為一個有 n 個頂點的幾何圖元以及最多 n 個作為控制點的額外頂點,輸出源則變成 0 或多個圖元。根據效果需要,這些圖元的可能和輸入的時候不同。
畫素著色器輸入為頂點間的片段,這些片段所包含的資訊來自於對三角形頂點資訊的插值,輸出成將要寫到幀緩衝裡的顏色。
結語
在遊戲中,絢麗的場景和角色是怎麼來的呢? 很簡單,紋理資料以紋理座標(UV 座標)定址的,而並非記憶體地址。通過著色器我們可以直接讀取紋理貼圖。
模型的頂點和紋理內的 UV 座標一一對應,這樣,紋理就以一定的規則貼在了模型上。
以上就是對渲染管線的簡單介紹,關於著色器語法且待下回分解。
本文作者:吳思淇(點融黑幫), 現就職於點融Social team,一個熱愛遊戲設計的web 前端程式猿一枚。
相關文章
- 圖形學之Unity渲染管線流程Unity
- Unity 高清渲染管線 ShaderGraph 實現簡單的表面水流效果Unity
- [譯]Metal 渲染管線教程
- 如何設定Unity高清渲染管線製作高階視覺化內容Unity視覺化
- unity2022.3.9+Pico更換渲染管線後打包,人物材質不可顯示問題Unity
- 剖析虛幻渲染體系(04)- 延遲渲染管線
- Unity3d 初探Unity3D
- Unity Shader之雙面材質和多Pass渲染Unity
- Unity的Flutter元件渲染UnityFlutter元件
- 圖形學3D渲染管線學習3D
- Wgpu圖文詳解(02)渲染管線與著色器GPU
- Unity 渲染流水線 :CPU與GPU合作創造的藝術wfdUnityGPU
- Unity6 URP17使用初探Unity
- 一文詳解 OpenGL ES 3.x 渲染管線
- 在Unity中渲染一個黑洞Unity
- GPU 渲染管線簡單總結(網上資料總結)GPU
- Unity中的三種渲染路徑Unity
- 一文讀懂什麼是渲染管線(7k字)
- Unity學習記錄-Universal RP渲染管道Unity
- 如何在 ? Space 上託管 Unity 遊戲Unity遊戲
- 《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線
- Unity效能最佳化GPU渲染最佳化UnityGPU
- Unity實現“籠中窺夢”的渲染效果Unity
- unity程式使用雲渲染技術是否要修改?Unity
- Jetpack 之 Navigation 初探JetpackNavigation
- Flask初探之WSGIFlask
- Unity 2018.2之粒子Unity
- Javascript 之 Event Looooooop 初探JavaScriptOOP
- Docker初探之Windows篇DockerWindows
- 初探STL容器之Vector
- 搞事情之 Vapor 初探Vapor
- netty系列之:netty初探Netty
- 初探Java安全之JavaAgentJava
- GPU OpenGL 管線GPU
- Flutter 1.17 Widget 之 NavigationRail 初探FlutterNavigationAI
- 初探webpack之編寫loaderWeb
- Unity實時渲染動畫《Windup》完整版溫情上線,獲奧斯卡參選資格Unity動畫
- Unity射線(轉載存檔)Unity
- 區塊鏈之以太坊初探區塊鏈