在手機上能否實現Forward+呢?還有其他比較適合手機的多光源演算法嗎?

手機上做延遲渲染是不太現實的,但是我們老闆堅持必須實現多光源,並且要求半透明的物體也可以接受多個光源,策劃案中很多玩法的邏輯就和多光源有關,請問有什麼辦法解決么?


謝邀。

forward+ == tile based forward。tile based deferred效率高於forward+,帶寬只比forward+大一點。所以移動平台用tile based deferred才是正路。

另外,tile based硬體上還可以用fetch_framebuffer做一個特別優化的tile based deferred實現。片外帶寬和forward一樣,更沒必要用forward了。

至於透明物體,照樣可以用deferred渲染到單獨的texture後疊回去。


我本人沒實驗過,但應該是可以的。

2014年SIGGRAPH Asia(深圳)有一個課程[1],其中Markus Billeter講的第 4 部分是在手機上實現更複雜一點的 practical clustered forward。我的專欄中提及了這個 SIGGRAPH Asia 2014 見聞之《高效地使用大量光源於實時著色》課程 - Milo的編程 - 知乎專欄,但就沒詳細講手機平台那部分,因為當天時間不夠也只是輕輕帶過,據知今年 SIGGRAPH 會再更新此課程,可以密切留意。

[1] 里對各種管道在手機平台上的比較

[1] Olsson, Ola and Billeter, Markus and Persson, Emil. "Efficient Real-Time Shading with Many Lights", SIGGRAPH Asia 2014 Courses, 2014. Ola Olsson - Chalmers University of Technology


我說一些Mobile HW上的限制:

1. 片上Constant Buffer數量有限,如果用到了太多的常量光源,Locality會打折扣。

2. 天然Tile-Based Rendering。不過片上存儲數量有限,所以MRT其實對性能是不利的。但是因為多光源本身一個Tile也不會放多大,所以就影響沒那麼大了。

3. 對於TBDR的架構的GPU, 比如比較新的PowerVR, Forward+就可以了(這個+主要是為了縮減光源),硬體自己的Pass一般會比較快。要注意的是,如果遇到了 Conservative Depth Output的情況,比如Discard in Pixel Shader,那仍然建議用TBDR。

4. 如果使用了UAV這樣看起來挺高級的技術,一定要在目標平台上測試一下性能。越是這種比較複雜的功能,對於追求一般應用下性能功耗比的Mobile GPU就越不利。


在手機上實現過普通的deferred shading. 現在別人在弄了,應該是用了三張RT. 16個燈.不知道樓主要什麼樣的運行環境和 要渲染的場景規模和效果

其實手機上的限制主要在各種不同平台的gpu的 feature 不一致, 一些太高的feature level很容易出問題. forward+的 原始版本是用compute shade 做的 tile. tiled base 貌似 uav. 在手機平台 其實都不實用.

我覺得最有戲 的其實是 Practical clustered shading. Humus - 3D humus 放出了一個practical clustered forward 的demo 源碼


同意龔大,forward+ == tile based forward,mobile上的tile based硬體結構決定了其適合tile based deferred,用的是tile local storage,屬於shader core內部的高速color buffer,開銷相對於普通管線不僅節省了bandwidth,而且支持多光源,所以不必猶豫GBuffer的問題,現在最大的局限就是tile local storage成本高所以容量有限,目前如果要上HDR加PBR各種空間會有不夠的情況。

至於半透,要支持可以,再走一個pass,但效率可想而知,和策劃美工好好商量吧


推薦閱讀:

在攝像機渲染時近大遠小的程度只受物體的深度影響?
OpenGL ES 依次渲染到不同紋理速度很慢?
cocos2dx 如何做到無卡頓載入紋理?
理論計算機圖形渲染技術是否已經到了沒有什麼可以研究的地步了?

TAG:手機 | 遊戲開發 | OpenGLES |