渲染流程筆記

場景渲染繪製過程中,怎麼能夠保證效果的同時最小化gpu的工作量,是提高幀率的關鍵,最基本的做法是裁剪技術,如空間分割,相機距離排序等,偏gpu的如材質排序等,但這些技術間是有衝突的,比如相機距離排序可能就與材質排序,透明與不透明物體渲染衝突,以前的工作中還沒有涉及到對整個渲染架構的調整及優化,故這部分雖一直有思考,但並沒有完整的去分析如何解決,最近看Game Engine Architecture時看到一個渲染流程,可以較好解決大部分問題,特此記錄一下。
先總結下自己想到的一般渲染邏輯中存在的問題:
1、要儘量減少gpu處理的網格,不可見物體的網格是完全沒必要提交的gpu的,這部通過裁剪技術偏cpu的裁剪和偏gpu的遮擋查詢
2、gpu要儘量減少狀態改變,狀態改變操作gpu必須等前一狀態的工作結束後才能進行,所以頻繁的狀態切換導致gpu頻繁等待,這個問題一般是通過材質排序解決,因爲相同材質的物體,渲染狀態都是一樣的。
3、減少cpu與gpu間的數據交換,主要是貼圖,這也是大顯存的優勢,如果顯存不夠用的話,就進行數據交換,貼圖排序可以減少數據量。
4、像素覆蓋,遠處物體的像素點會被近處物體遮擋,所以這部分像素點的渲染完全是浪費(特別是有複雜光照計算時,更是浪費gpu計算,也是延遲渲染或光照的優勢),通過物體距離相機距離排序可以解決,先繪製離相機近的,再繪製離相機遠的,當然這個並不能全部解決,因爲物體可能交疊,也可能自覆蓋。
5、半透明物體渲染,半透明物體會透過它後面的物體,所以必須由遠到近的繪製,這與上一點是衝突的,一般的解決辦法是把半透明的物體篩選出來放到最後渲染,同時不透明物體渲染還可以關掉alphablend以提高效率。


那麼怎麼樣的渲染邏輯才能如何能儘可能解決上面問題,Game Engine Architecture給出了一個方法,使用到了gpu z prepass特性,具體做法是:
1、不明物體渲染兩遍,第一遍用由近到遠的順序渲染,並關閉pixshader,僅輸出z-buffer,這樣渲染速度會很快。第二遍按材質排序渲染,由於已經有了z-buffer所以像素覆蓋的問題可以避免,pixel shader工作量大大減少,同時材質和遠近排序的矛盾也得到解決。
2、渲染半透明物體,由於透明物體必須由遠到近渲染,所以無可避免導致,無法材質排序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章