網(wǎng)站備案做網(wǎng)站要轉移嗎廣州推廣系統(tǒng)
文章目錄
- 概覽:游戲引擎中的渲染系統(tǒng)
- 四個課時概覽
- 一,渲染管線流程
- 二,了解GPU
- SIMD 和 SIMT
- GPU 架構
- CPU到GPU的數(shù)據(jù)傳輸
- GPU性能限制
- 三,可見性
- Renderable可渲染對象
- 提高渲染效率
- Visibility Culling 可見性裁剪
- 四,紋理壓縮(Texture Compression)
- 五,Cluster-Based Mesh Pipeline
- 總結
概覽:游戲引擎中的渲染系統(tǒng)
-
游戲渲染面臨的挑戰(zhàn)
- 渲染量大、算法復雜、all in one
- 對于不同硬件顯卡的適配和優(yōu)化
- 實時性(60fps、120fps)和分辨率(1080p、4K、8K)要求
- CPU帶寬和內(nèi)存限制(游戲邏輯、網(wǎng)絡、動畫物理等都是CPU處理的)
-
這塊是一個實踐性、工程性知識(與純理論相對),因此技術更新?lián)Q代非???/p>
四個課時概覽
一,渲染管線流程
流程參照101和圖形基礎
二,了解GPU
SIMD 和 SIMT
- 單指令多數(shù)據(jù)SIMD(Single Instruction Multiple Data)運算,對多個數(shù)據(jù)同時進行同一種運算(指令級并行),一般用于矩陣計算
- 單指令多線程SIMT(Single Instruction Multiple Threads)運算,多線程處理運算(相當于GPU多線程版SIMD),GPU的線程數(shù)是比CPU多得多,因此處理簡單計算快
GPU 架構
- GPU上的運算是分到一個個的流式多核處理器SM(Streaming Multiprocessor)里計算的,SM用于運行CUDA(并行處理器)。計算時不僅可以并行,相互間還可以交換數(shù)據(jù)(硬件加速),這是現(xiàn)代GPU最重要的架構
- 最先進的引擎一直在更新,比如逐漸能夠使用compute shader、mesh shader等等;以及一些優(yōu)化比如Tile-Based,這些都跟硬件架構息息相關,如果能先了解下顯卡硬件的工作原理,有助于學習這些后續(xù)知識~(藝術家也一樣)
CPU到GPU的數(shù)據(jù)傳輸
- 現(xiàn)代引擎中一般繪制和邏輯是不同步的,但如果某幀繪制需要邏輯運算的數(shù)據(jù)時,就可能出現(xiàn)不同步的延遲。并且CPU與GPU之間的數(shù)據(jù)傳輸非常慢,因此默認原則:盡可能用CPU->GPU的單向傳輸,而不從GPU讀取數(shù)據(jù)。
- 緩存(Cache)效率在GPU中非常重要,如果計算時要加載數(shù)據(jù)不在緩存里,就會出現(xiàn)Cache miss(讀取到時Cache miss)情況,這時候如果想去內(nèi)存讀取,甚至會花費一百多個時間周期,處理效率大大降低
GPU性能限制
- 內(nèi)存瓶頸Memory Bounds
- 算術邏輯單元ALU Bounds
- 紋理貼圖單元TMU(Texture Mapping Unit) Bound
- 帶寬瓶頸BW(Bandwidth) Bound
三,可見性
Renderable可渲染對象
- Mesh:儲存每個點的位置、法線、uv、權重等和三角形的點索引
- Materials:經(jīng)典模型Phong Model、PBR Model等
- Texture:有時候比材質(zhì)還要重要
- Shaders:shader在引擎中不算是源碼,而是“數(shù)據(jù)”;shader graph連連看
- SubMesh:Mesh根據(jù)材質(zhì)不同分為不同子網(wǎng)格,即SubMesh
提高渲染效率
- 多個模型的多個submesh重復了怎么提高效率呢?
- 可以建立一個資源池(Resource Pool),將同一種資源儲存到統(tǒng)一的資源池中,并建立緩存;
- Instance(實例化)相當于先定義一個物體的Renderable,然后再將該數(shù)據(jù)實例化并渲染
- 游戲中相同材質(zhì)的submesh,也可以把場景物體按照材質(zhì)排序,把相同材質(zhì)的物體group到一起,然后只需設置一次材質(zhì)(減少GPU等待數(shù)據(jù));再進一步GPU Barch Rendering可以在一次drawcall里一次性設置并渲染大量同材質(zhì)物體
Visibility Culling 可見性裁剪
- 基礎原理是通過包圍盒判斷,優(yōu)化用BVH Culling之類的算法(尤其是動態(tài)東西很多的時候)或者PVS思想。
- PVS(Potential Visibility Set):先用BSP-tree將空間進行劃分,每個小格子之間用Portal(傳送門)連接,繪制時只繪制當前各自及其能看到的其他格子的內(nèi)容即可(用于動態(tài)載入場景),并且每個格子的可見性是預設好的
- 隨著硬件升級,更多使用的是GPU Culling,用GPU快速計算出每個物體的包圍盒是否可見,搭配preZ等技術
四,紋理壓縮(Texture Compression)
常見的圖片格式如JPG、PNG等都是一種壓縮格式,它們壓縮率高,但是無法實現(xiàn)隨機訪問,且算法復雜。而在引擎中的紋理需要有高效壓縮和解壓、隨機訪問、壓縮率高質(zhì)量好的特性,因此一般采用塊壓縮(Block Compression)的技術,比如bxt格式是把圖片分為4X4的小格子,并且只記錄像素最大最小值和各個像素在這兩個值之間的插值?!赶喈斢谟?4位表示原本需要384位(24*16)的16個像素:32位用565格式記錄2個顏色,32位記錄每個像素的索引,除兩個像素顏色外只支持2種插值,共4種,用10的組合作為索引記錄,其他顏色丟失」
- 在PC上常用BC7(最新)和DXTC格式,手機上常用ASTC(最新)和ETC/PVRTC格式
五,Cluster-Based Mesh Pipeline
隨著發(fā)展玩家在一個場景里對模型精度、細節(jié)要求越來越高,帶來的GPU渲染負荷也增大,因此引擎?zhèn)戎饾u向Cluster-Based Mesh Pipeline方向發(fā)展。
- 管線核心思想:將非常精細的模型分為一個個的小Cluster,比如64個三角形分一個,然后以Cluster為單位進行渲染,剔除和深度排序也是基于Cluster bound而不是整個物體。(natine就是該思想拓展細分到像素級別)(想想曲面細分不就是一個三角形分成更多個然后統(tǒng)一渲染嗎)這也對程序員提出了更高的要求。
總結
- 游戲引擎的設計與硬件架構密不可分,要做好一個圖形程序,就得了解顯卡架構
- 游戲引擎的一個核心問題是Mesh、Materials等數(shù)據(jù)之間的關系,submesh就是一個很好的解決方法
- 大師:do nothing—用Culling算法使得引擎繪制盡可能少的東西,CPU、GPU做的事越少越好
- GPU代替CPU計算–GPU Driven