UE4渲染模塊學習筆記

注:轉載自知乎文章:https://zhuanlan.zhihu.com/p/57561144
本文僅爲個人閱讀筆記,歸納整理。

優化的方法論

圖形工程師一直在追求渲染質量、性能、功能這三者的平衡。一個空場景性能必然是最佳的,但這沒有意義,另一方面若場景都用最高精度的圖片或是堆砌各種功能點,遊戲卡得根本玩不了,也是不行的。

在圖形優化的路上有很多具體的實現,但都可以歸納成以下六點方法論:

1)流水線:併發多線程,使硬件的利用率達到最高;

2)預計算:能事先計算的就儘量事先做,降低Runtime的計算成本,比如靜態光的lightmap;

3)局部化:只在可見的局部區域裏做事情,比如屏幕空間反射的計算(SSR);

4)先粗後精:先用消耗低的方法縮小計算範圍,再用消耗大的方法執行精確計算,比如八叉樹遮擋查詢;

5)時空互換:用時間換空間或是空間換時間,比如lightmap就是空間換時間的例子;

6)負擔轉移:使用stat unit查看如果是CPU的瓶頸,又不可進一步優化了,可以考慮將CPU的計算移至GPU計算,如骨骼動畫計算可以移至GPU做。

DrawCall Example

所謂drawcall,是指CPU向GPU發出的一次渲染指令,讓GPU繪製指定的幾何體。
在這裏插入圖片描述
在這裏插入圖片描述
CPU會提交六次drawcall,一次天空,一次地面,左側兩個柱子各一次(因爲是三個獨立的模型),最右側柱子上下兩部分採用了不同的材質,所以需要提交兩次渲染信息,這樣就多一次drawcall,共計6次drawcall。這張圖展示了渲染的順序,藍色的是地面,因爲事先做了prez,所以爲地圖上原來柱子的區域留空了沒去繪製。

從左到右依次是:渲染地面,渲染右側柱子的下半截,渲染中間柱子,渲染左側柱子,渲染右側柱子的上半截,渲染天空。

渲染順序也就側面反映了提交drawcall的次序,其實對於圖形工程師而言,不必特別注意drawcall提交次序,只要最終結果是對的就行。不過這裏也可以發現一個問題,那就是爲啥沒有完整地渲染完右側的柱子,再去渲染中間的呢?那是因爲渲染器會把相同材質的對象放到相鄰drawcall中處理,這樣可以節省讓硬件切換渲染狀態的耗時。可以注意到這裏右側柱子下半截的材質與其他柱子材質是一樣的,所以會放到連續的drawcall中處理,而右側柱子上半截材質不同,被放到了所有相同材質柱子渲染完成後才進行繪製。

材質應用流程

在這裏插入圖片描述
.usf模板文件中提供了基礎的材質變量和函數,這些不能改變,但同時也把可以變化的代碼段留了空,這時開發同學就可以利用材質編輯器,自動將圖形化的連線轉成HLSL代碼插入到.usf文件裏(print到.usf中的%s處):
在這裏插入圖片描述

反射

  • 反射捕獲(Reflection Capture)
  • 平面捕獲(Planar Reflection)
  • 屏幕空間反射(SSR)

屏幕空間反射(SSR)

待補充

光照

靜態光照

  • lightmap存儲靜態光的直接光分量
  • 採樣點存儲間接光分量

動態光照

動態陰影

  • 常規動態陰影(Regular Dynamic Shadows)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章