淺談延遲渲染、移動GPU架構和Metal

2021-02-21 快手Ytech
對實時渲染有了解的小夥伴想必聽過前向渲染(Forward Rendering),或許還對延遲渲染(Deferred Rendering)或者他的後繼者Deferred lighting延遲光照有所耳聞。Deferred Rendering一般不會單獨出現,有時還會帶上tile-base這小朋友。偶爾還會有forward plus這小哥帶著他的cluster-base朋友出來添亂。今天這篇文章會給大家聊聊前向渲染和延遲渲染這兩位同學,當然主要是這位還沒有在移動端取得成功的延遲渲染,並說說他相對不為人所知的原因,還有我們這些從業者想把他推出去變成當紅炸子雞的努力。0x00 這個你會,可編程渲染管線

在說那幾位之前,我們先聊點輕鬆的東西,在gles1.0時代,硬體渲染管線還是固定的,就像是一個已經設計好的流水線,旁邊有幾個開關,程式設計師能做的就是切換這一個個開關,修改紋理、渲染狀態、在幾個固定的光照模型之間切換。有限的開關越來越難滿足大家對效果無止境的需求。可編程渲染管線隨之而來,取代了這一個個固定的開關的是幾個坐在固定位置的工人(vertex stage/fragment stage),這些工人可以接受我們的指令進行繪製。vertex shader、geometry shader、fragment shader就是這幾個勤勞的工人,通過他們,我們就可以控制GPU是如何繪製物體的。

0x01 前向渲染

藉助上面幾個勤勞工人的幫助,前向渲染閃亮登場。前向渲染是一種非常直接的渲染方式,我們提交的mesh,經過vs、gs、fs等shader,直接繪製到color buffer等待輸出到屏幕。在考慮光照的情況下,在場景中我們根據所有光源照亮一個物體,之後再渲染下一個物體,以此類推,很線性的Per-Object/Per-Light方式進行繪製。

貼一下前向渲染的偽代碼:

這位直接了當的老哥有如下特點:

正如最後一點特點,當場景複雜度上升,大量光源大量物件的時候,前向渲染O(n*m)的複雜度就是不能承受的。另外因為一般情況下只繪製color buffer,對需要法線和深度進行計算的後處理算法支持不好,這些後處理往往對性能影響很大。

0x02 延遲渲染先貼一張圖片。說實話上圖場景物件並不算多,只是光源太多足有1000以上。在當前硬體水平下,這種場景傳統前向渲染只能表示無能為力。為了解決這種問題,延遲渲染在2004年GDC上被正式提出。延遲渲染( Deferred Rendering),即延遲著色(Deferred Shading),顧名思義,是將著色計算延後進行處理的一種渲染方法,可以將延遲渲染( Deferred Rendering)理解為先將所有物體都先繪製到屏幕空間的緩衝(即G-buffer,Geometric Buffer,幾何緩衝區)中,再逐光源對該緩衝進行著色的過程,從而避免了因計算被深度測試丟棄的片元著色而產⽣的不必要的開銷。也就是說延遲渲染基本思想是,先執行深度測試,再進行著色計算,將本來在物空間(三維空間)進行光照計算放到了像空間(二維空間)進行處理。對應於前向渲染O(m*n)的複雜度,經典的延遲渲染複雜度為O(n+m)。

此處呈上經典延遲渲染的偽代碼

目前看起來延遲渲染把複雜度降了下來,面對複雜場景+多光源的需求面前有了辦法。然而這也帶來了其他的問題。對比前向和延遲的流程圖可以發現,延遲管線下多了深度、法線、顏色等幾張G-Buffer。這些都是屏幕大小的尺寸的Render Target,所帶來的內存以及帶寬壓力很大。

延遲渲染有以下特點:

內存開銷較大。

讀寫G-buffer的內存帶寬用量是性能瓶頸。

對透明物體的渲染存在問題。在這點上需要結合前向渲染進行渲染。

對多重採樣抗鋸齒(MultiSampling Anti-Aliasing, MSAA)的支持不友好,主要因為需開啟MRT。

由於Deferred Shading的Deferred階段是在完全基於G-Buffer的屏幕空間進行,這也導致了物體材質信息的缺失,這樣在處理多變的渲染風格時就需要額外的操作。

針對上文的問題,業界有主流有兩種優化方式。

1.Light Pre-Pass即Deferred Lighting 延遲光照技術,通過減少經典延遲渲染所使用的G-Buffer數量來提高性能,最早由 Wolfgang Engel於2008年在他的博客中提到的。

2.分塊延遲渲染,tile-based Deferred Rendering(記得開篇提到的tile-base小兄弟沒,這會出場了)。該方法通過可以在一次繪製處理多個光源,以及來降低對G-Buffer的讀寫開銷。

延遲光照有對MSAA支持良好、可以使用更多材質等等優點,由於數據證明大量光源下性能不及分塊延遲渲染,該部分不會介紹,感興趣的同學可以在引用中的連結自行查閱。下面我們會重點說說分塊延遲渲染。

0x03 分塊延遲渲染

經典延遲渲染的瓶頸在對G-Buffer的讀取上,在存在大量光源的前提下,每個光源繪製都需要讀取G-Buffer,並和color buffer進行混合。考慮到每個光源都有各自覆蓋的面積,不同光源覆蓋區域重疊的情況會非常多,被多光源覆蓋的像素還是需要在各自光源的繪製過程中被重複計算。

針對這一個問題,分塊延遲渲染把屏幕分成很多個tile,然後計算一下每個tile被哪些光源覆蓋到,把覆蓋tile的光源保存在tile的光源列表中,繪製tile時一次繪製完成所有覆蓋光源光照計算。tile以及光源列表見下圖。

分塊延遲渲染流程一般為:

1.生成G-Buffer。

2.將G-Buffer分tile,每個tile用compute shader(偶見在cpu中間計算的實現)計算出depth bound。

3.進行light cull,得到light index list。

4.color pass,使用G-Buffer信息,用該fragment所在tile的light index list進行繪製。

實驗數據證明分塊延遲渲染的在大量光源存在的情況下性能明顯好於延遲光照。

0x04 小結

上文介紹了前向渲染和延遲渲染,在延遲渲染及其優化版本用了較大篇幅分析延遲渲染出現理由以及優缺點。而對兩種渲染方式的選擇也很簡單,就像是一個天枰,一邊放著複雜場景和多光源的需求,還有低代價使用依賴深度和法線的後處理,而另一邊就是內存開銷大以及頻繁讀寫G-Buffer的性能開銷。如何選擇已經看需求,也需考慮技術團隊的經驗能力。而前向渲染因為沒有G-Buffer以及light cull的存在,所以在簡單場景下效率頗高,光照多其實也有解,lightmap配合IBL的方案很成熟的。

只是目前對比3A大作頗多採用延遲渲染的現狀相比,手機端市場佔有率最高的兩款商業引擎unity3d和ue4陣營中也未見幾款延遲渲染渲染的作品。難道限於手機相對孱弱的性能大家都放棄了大場景多光源的需求麼?並不盡然,原因如何且看下文。

0x05 移動端GPU兩三事

移動端的硬體設計最初要考慮的其實是功耗,功耗會影響耗電、發熱、晶片大小等等。移動端GPU肯定也必然優先考慮功耗,沒有人願意面對分分鐘沒電的烤手寶,過熱也必然帶來降頻影響本就不是很優秀的處理器性能。那麼問題來了,影響功耗的最大因素是什麼?帶寬。

看到多次出現的帶寬,讀者大人應該能感受到移動端針對延遲渲染深深的惡意。在得出某種結論之前,還是有必要在對移動端GPU的背景再多介紹一下。

目前移動GPU領域,高通的adreno、ARM的mali、Imagination PowerVR佔據了主要市場。在GPU設計上,這三家都沒有採用桌面GPU主流的IMR(Immediate Mode Rendering)架構。以PowVR為例,Imagination 設計採用了Tile Based Deferred Rendering架構,簡稱TBDR,為了和上面的分塊延遲渲染區分開來,這裡姑且先叫做硬體TBDR。

要區分兩者,容我先介紹一下IMR架構。      

IMR就像opengl等圖形API書籍中介紹的標準圖形渲染管線,頂點階段之後裁剪投影剔除,光柵化然後著色再之後像素操作。直來直去的有些像開篇介紹的forward render。因為桌面GPU的功耗、散熱限制條件較少,帶寬以及顯存也明顯高於移動端。GPU在沒有諸多限制的情況下,這種直接的方式效率是最高的。 

移動端上處處限制,設計架構也不得不採用犧牲效率換取帶寬的方案,且看PowerVR的渲染流程。

TBDR該詞分兩部分來理解。tile-base講的是將需要渲染的畫面分成一個個tile,這裡一般是4x4或者8x4的矩形塊。模型的頂點經過Vertex Shader運算以後會組裝成一個個的triangle,這些triangle會被緩存在一個triangle cache裡面。如果某個triangle需要在某個tile裡面繪製,那麼就會在該tile的triangle list中存一個索引。等一幀裡面所有的渲染命令都經執行完Vertex Shader生成triangle以後,每個tile就會有一個triangle list,這list就包含了需要在該tile內部繪製的所有triangle。然後GPU再基於triangle list執行每個tile的raster和Per-fragment operation。是不是有點上文提到的軟體TBDR的感覺了?

DR實際上出現在兩個地方,一是在光柵化之前,繪製指令被緩存到Primitive List和Vertex Data中,所有指令處理完畢之後再進行光柵化。第二是在紋理採集和著色階段之前,像素會進行名為HSR(Hidden Surface Removal)的early-z階段,這一波會進行On-chip(片上)深度測試以及深度緩存寫入,著色再次延遲在深度測試之後。

PowerVR之外的另外兩家GPU架構也都是基於tile實現的,Mali同樣有類似HSR的early-z技術。Adreno自家的FlexRender技術會在TBR和IMR針對效率自行切換,小尺寸的rendertarget使用IMR提升速度,反之則使用TBR拯救帶寬。

大家在設計架構上用的努力折射出移動端上帶寬問題影響確實嚴重。誠然軟體TBDR在目前的中高端手機上運行幀率已經問題不大,不過發熱和耗電問題卻不易解決。另外light-cull等操作對圖形要求gles3.1以上,國內市場雖然問題不大,但是東南亞群體gles2.0比例卻依然不低。

問題雖然很多,不過大多時候我們依然要目光向前。架構某種程度反應所面對的問題,但更多的是體現解決問題的方法。

0x06 基於metal的TBDR渲染設計

說到現在,我們已經說了兩種形式的TBDR了,一種是軟體TBDR,完全程序控制,劃分tile,計算光源列表再進行著色。另外一種是則是硬體TBDR,GPU架構實現。兩者的目的也不盡相同,前者為了解決多光源問題,同時帶來了廉價的後處理,問題是增加了帶寬開銷。後者用效率(HSR的存在未必見得效率影響很大)換帶寬。

Apple在自家的metal demo中提供了一種可能性,即利用on-chip內存實現的Single-Pass Deferred Rendering。這個示例在桌面端以及移動端使用了兩種渲染器,這兩種都基於傳統的延遲渲染。

即在第一個pass先生成G-Buffer,在第二個pass進行光照計算。

    

在非TBDR(Mac)的架構之下,第一個pass的G-Buffer會被緩存到系統內存中,第二個pass讀取G-Buffer,頻繁讀寫大圖片,在桌面端問題並不大。而在IOS上,Apple使用了Single-Pass Deferred Rendering渲染器,收益於TBDR的硬體架構,通過顯式的設置ColorAttachment的store&loadAction,gpu會將硬體拆分的tile的render target放在on-chip memory中,在lighting階段所有需要的render target都不需要在從系統內存中讀取,光照計算結束之後on-chip memory中的渲染結果再統一寫回系統內存。

流程如下圖。

    

至此,由硬體處理TB,軟體處理DR的渲染流程完成了。在這個基礎上,我們可以使用metal2的新特性Raster Order Group以及Image Blocks進一步優化Pipeline,有興趣的同學可以在引用連結中查找並自行實現。

在整個渲染流程中,依賴硬體TBDR框架,完成了軟體延遲渲染配合硬體分塊,使用on-chip memory減少帶寬壓力,在此基礎上,使用metal2的新特性Raster Order Group以及Image Blocks可以進一步優化Pipeline,有興趣的同學可以在引用連結中自行了解,這裡不再介紹了。

0x07 總結

本文中介紹了前向渲染以及延遲渲染,結合移動端GPU架構進行分析,旨在幫助大家結合自身技術以及需求合理選擇,並展示了利用GPU架構以及現代圖形API優化渲染流程的方案。因為篇幅問題,對Clustered方法以及Forward Plus沒有介紹,望理解。

感謝閱讀,謝謝。

引用

1. [forward-rendering-vs-deferred-rendering]

https://gamedevelopment.tutsplus.com/articles/forward-rendering-vs-deferred-rendering--gamedev-12342

2. [《Real-Time Rendering 3rd 第七章續 · 延遲渲染]

https://blog.csdn.net/poem_qianmo/article/details/77142101?utm_source=blogxgwz4

3. [Rendering a Scene with Deferred Lighting]

https://developer.apple.com/documentation/metal/rendering_a_scene_with_deferred_lighting

4. [針對移動端TBDR架構GPU特性的渲染優化]

https://gameinstitute.qq.com/community/detail/123220

5. [Apple - Understanding GPU Family 4]

https://developer.apple.com/documentation/metal/gpu_features/understanding_gpu_family_4

6. [Apple - About Raster Order Groups]

https://developer.apple.com/documentation/metal/gpu_features/understanding_gpu_family_4/about_raster_order_groups

7. [Deferred Lighting]

http://diaryofagraphicsprogrammer.blogspot.com/2008/03/light-pre-pass-renderer.html

8. [移動端gpu架構淺析]

https://gameinstitute.qq.com/community/detail/103959

9. [imgtec TBDR]

https://www.imgtec.com/blog/understanding-powervr-series5xt-powervr-tbdr-and-architecture-efficiency-part-4/

10.[Light Pre-Pass Renderer]

http://diaryofagraphicsprogrammer.blogspot.com/2008/03/light-pre-pass-renderer.html

相關焦點

  • 英偉達發布RTX30系列移動GPU,將有70餘款筆記本換「芯」|CES 2021
    來源:鈦媒體APP在CES 2021上,英偉達發布了全新GeForce RTX 3060,同步亮相移動版RTX30系列GPU,其採用了針對筆記本電腦設計的安培架構,包括RTX 3060、3070和3080。
  • 顯卡帝教你讀懂GPU架構圖 輕鬆做達人
    演示硬體幾何和光影(T&L)轉換的Demo     ● 傳統的固定渲染管線    渲染管線也稱為渲染流水線,是顯示晶片內部處理圖形信號相互獨立的的並行處理單元。在某種程度上可以把渲染管線比喻為工廠裡面常見的各種生產流水線,工廠裡的生產流水線是為了提高產品的生產能力和效率,而渲染管線則是提高顯卡的工作能力和效率。    什麼叫一條「像素渲染管線」?簡單的說,傳統的一條渲染管線是由包括Pixel Shader Unit(像素著色單元)+ TMU(紋理貼圖單元) + ROP(光柵化引擎)三部分組成的。
  • JavaScript開發重型跨平臺應用以及架構
    今天準備好好談一談重型應用的架構以及技術選型,為接下來我的正式架構設計做個鋪墊。為什麼寫重型應用的架構和技術選型傳統的web前端,只能發個ajax請求,畫畫頁面。他們做技術顧問,賣課程,出書,辦培訓都甚至比單純寫業務代碼賺得多很多正式開始國內移動端開發人員,在我看來已經人目前已經夠多了,如果說你現在不會React-native和Flutter,我也不建議你去深入學習,特別是Flutter.為什麼要這麼說?React-native剛出來的時候,坑多吧。
  • 《使命召喚16戰區》gpu滿閃退怎麼辦 gpu滿閃退解決方法介紹
    很多小夥伴在遊戲中會遇到gpu突然100然後閃退的情況,今天小編給大家帶來cod戰區gpu滿閃退解決方法介紹,快來看一下吧。 cod戰區gpu滿閃退解決方法介紹 很多小夥伴在玩遊戲的時候突然會遇到gpu滿的情況,然後閃退。
  • 小米帶來國內安卓系統GPU驅動首次更新!
    Adreno 是目前最先進的移動圖形處理背後的發電站,它能加速遊戲、用戶界面和網絡瀏覽器中複雜幾何體的渲染,能夠滿足當今行動裝置的遊戲、用戶界面、Web技術所要求的性能水平,並能以優異的圖形性能帶來良好的移動體驗。Adreno GPU 專為移動API(應用程式接口)和行動裝置限制而設計,重點在於性能和高效的電源使用。
  • 移動端實時3D目標檢測,谷歌開源出品,安卓下載就能用
    昨日 MediaPipe 發布 0.7 版,並加入了移動端試試 3D 檢測模型。目前 MediaPipe 包含人臉檢測、手部檢測、頭髮分割和視頻自動橫豎屏轉換等功能。AR 合成數據的生成示例,在藍色書籍旁邊,虛擬的白色盒子可以渲染到真實場景中。3D 目標檢測的流程是什麼樣的對於 3D 目標檢測,研究者先構建了一個單階段模型 MobilePose,以預測單張 RGB 圖像中某個目標的姿態和物理大小。
  • Ampere架構新特性解析:全方位升級帶來性能暴漲
    [PConline 雜談]隨著RTX 3080顯卡的性能解禁,關於NVIDIA Ampere架構和RTX 30系列顯卡的相關信息也可以更多地披露出來,今天我們就根據我們實測和官方提供的信息,跟大家一起剖析一下新架構顯卡性能暴漲的秘密。
  • 新春GPU超值福袋!RTX3090包周/月特權0元搶!
    比如,CUDA核心居然有10492個,顯存24GB,皆是RTX2080ti的兩倍多,至於架構和張量核心,直接向太上皇A100看齊,採用了安培架構以及第三代張量核心。連國外著名測評師Tim Dettmers,也對RTX3090讚不絕口,認為它是現階段乃至未來幾年,最適合煉丹師們的GPU。
  • 雲原生架構定義了vRAN的未來
    長期以來,虛擬無線接入網(RAN)的建設和邊緣數據中心的使用一直是移動通信領域的主要話題-這種發展影響到當前的4G和未來的5G網絡。但是,技術繼續從虛擬化工作負載向容器,雲原生架構和應用程式發展。傳統的無線電接入網絡由天線,基站(基帶單元– BBU)和控制器組成。這使它們成為行動網路中最昂貴的組件。
  • 微影技術架構實踐之路
    十億級別DPV千萬級別DAU系統可處理訂單為每秒10萬整個系統的調用達到每秒30萬90%請求的延遲時間200毫秒以內SLA(Service-LevelAgreement,服務等級協議)99 %        好的系統架構都相似,而不合理的系統卻有各自的問題。
  • 蘋果增加了新的Mac Pro GPU配置
    其他選項包括Radeon Pro W5700X(比基本配置多600美元)、Radeon Pro Vega II(2400美元)和Radeon Pro Vega II Duo(5200美元),以及W5700X、Radeon Pro Vega II和Radeon Pro Vega II Duo的雙gpu變體。
  • 移動世界需要ARM架構,X86已經受到了衝擊
    ARM架構已經發展了一段時間,最近達到了一個轉折點。 早在2000年,嵌入式系統公司Lineo的臺式機運行的還是X86架構,但他們銷售的產品卻是基於MIPS或RISC架構晶片的。
  • CPU和GPU架構了解下!
    如果說指令集架構和製程工藝決定了SoC的天賦(詳見《硬核科普!為啥說SoC的性能取決於架構和工藝?》),那SoC的直觀戰鬥力則全看CPU+GPU模塊的規格了。從性能的角度來看,不同時期的架構之間則存在明顯的性能壓制,比如Cortex-A77天生就比Cortex-A76更強,但同一時期的原生、魔改和自研架構之間的差異其實並不大,主要還是受制於核心數量、多叢集和最高主頻方面的影響。
  • 【博採】Netflix:數據處理架構的演進
    該觀看會話數據架構能夠應對從用戶體驗到數據分析的諸多場景,其中最主要的場景有三個:用戶看了哪些視頻?系統需要知道每一個用戶的所有觀看歷史,以便於為用戶推薦相關的視頻內容,同時在頁面上的「最近觀看」一欄中顯示觀看歷史。用戶所看的內容對於用戶興趣的衡量,產品和內容的決定非常重要。用戶從哪裡離開了視頻?
  • 魅藍metal發布
    魅藍是魅族科技於2014年創立的全新子品牌,此前已發布四款產品:魅藍note、魅藍、魅藍note2和魅藍2,魅藍metal是魅藍品牌旗下的第五款產品。魅藍品牌以「QualityForYoung」(青年良品)為品牌內核,主攻年輕人市場。魅藍品牌在推出至今不到一年,銷量就達到1300萬臺。
  • 技術中臺應用集成架構之移動微應用集成
    應用集成架構簡介   2。移動微應用平臺架構分析   3。移動微應用集成   一、應用集成架構簡介   1.1 數位化中臺建設之技術中臺   二、移動微應用平臺架構分析   Primeton? Mobile移動平臺是一款集移動開發、運營、運維、管理一體化的智能平臺,為客戶提供一站式移動解決方案,幫助客戶快速高效的構建移動生態,提升企業工作效率和管理模式,加速企業信息化商業模式的創新和變革。   Primeton?
  • AMD RX 6000架構揭秘:獨家雞血、飛升54%
    RDNA 2雖然是RDNA架構的更新版本,並不是完全重新設計,但是它帶來的突破和提升是驚人的,也完全實現了項目起步之初設立的看似不可能的目標。  至於RDNA 2架構的底層細節,比如說計算單元的變化,AMD這次沒有給出更多資料,只是簡單提到了幾點,包括 精簡TLB以降低延遲、重新設計32位像素流水線並支持HDR格式、優化幾何分派與曲面細分、全方位精細時鐘門控、頻率樹分離與門控、最小化數據轉移、重新平衡流水線、高性能庫等等 ,但沒有任何圖示。
  • Yuimetal 退出 BABYMETAL
    Yuimetal 正式宣布離開 BABYMETAL 似乎沒有令我們太驚訝。她已經好久沒有出現在 BABYMETAL 的演出上了。
  • 英偉達(NVDA.US)發布RTX 30系列筆記本顯卡,安培架構GPU正式進入...
    來源:智通財經網智通財經APP獲悉,英偉達(NVDA.US)在CES展會上正式發布了針對筆記本電腦的安培架構RTX 30系列顯卡,包括RTX 3060、3070和3080,這標誌著安培架構GPU正式進入了移動領域。