shader 一個pass計算多個光源如何實現?

是將多個光源的信息當作參數分別傳入shader嗎?是不是支持的光源數量受到shader可以訪問的寄存器數量限制?


是,但你不用太擔心。在你性能低成翔的時候,寄存器或cbuffer還用不完的。


接 deferred rendering得到G-buffer之後的多光源計算是怎麼處理的? - 計算機圖形學 這個問題,我來重新總結一下吧,之前在龔大大的內容下面評論解析時,一開始說的比較籠統。。。。。

這裡只講dx9限制下的,因為是國內嘛。。。。

龔大在light volume作用方面說的挺全了,就是只渲染這個燈光幾何體的像素,來避免全屏幕像素計算。(HeYong大大說的tiled based deferred lighting,是分塊治之,也是為了避免全屏幕像素計算)

因為美術都是專業藝術出身的嘛,會要求各種特別顏色的燈光布置,比較學院派。於是美術對場景的布光,一般都是一盞dir light(用來表現太陽等主光源什麼的),很多很多的小範圍點光(表現間接光照/燈光/火光),有時也有spot light(比如手電筒,落地燈等)

遊戲類型:1、如果是舞台遊戲,則很多燈光重疊。

2、如果全3d遊戲,視野太自由,也會很多重疊。

3、如果是暗黑風格2.5d遊戲。即視角整體是從上往下看著場景,美術一般是分布了非常大量的點光,只是為了特別的間接光照效果,到整個場景,除了dir light照耀整個場景外,每個點光掌管一個個區域,一般重疊兩個點光。比如我們遊戲:

可以在官網看:《鎮魔曲》官方網站

扯遠了,回到正題,light volume的具體實現:

1、很多個dir light渲染,light volume是全屏矩形,如題主所說實現;

2、很多個point light或很多個spot light,light volume分別是很多個球形和圓錐形。可以用instance按light volume形狀渲染。

於是實現時,point light是vertex stream先實現一個單位球形(spot light是一個單位圓錐體),instance stream放每個燈光具體位置、範圍大小(spot light還要放方向、張角等),以及光照信息參數(顏色、衰減等等)。vs計算得出實際形狀,光照信息的參數直接傳到ps,ps中就可以計算這個燈光的光照效果了。到了output merger stage,開啟alpha blend,設為直接疊加(one),於是燈光可以自動疊加總體效果了。


是的,貌似限制四個光源。所以需要延遲渲染....額...等大神回答吧...


推薦閱讀:

國內外哪些學校的計算機圖形學比較強?
SIGGRAPH 2016有什麼看點?
有些神奇的圖片,比如這張,能解釋一下什麼原因嗎?
請教一篇siggraph上比較好實現的論文?
WebGL2.0標準的發展和普及如何?

TAG:OpenGL | 計算機圖形學 | Direct3D |