2013-02-17 77 views
1

我有一個點光陰影地圖程序,但在如何控制多光源情景方面有點失落。我如何設置多個燈,每個燈都有自己的「深度紋理」?如果是這樣,它們如何組合起來用於場景的最終渲染(顯然,並非所有的燈都會一直處於活動狀態)?處理多燈光和GLSL着色器程序

考慮到這一點似乎更合乎邏輯有單獨的(小)深度立方體貼圖,而不是整個場景使用的立體貼圖(特別是對於近距離水平而不是開放景觀),但是實施這樣的系統只會讓我盯着屏幕。

謝謝。

回答

1

有很多方法可以完成你想要的任務。該方法取決於您的確切需求。如果你正在使用OpenGL 2.1或更早的版本,你可以通過讓多個OpenGL的燈光設置多個燈:

glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 
glLightfv(GL_LIGHT0, <light 0 settings>); 
glEnable(GL_LIGHT1); 
glLightfv(GL_LIGHT1, <light 1 settings>); 
...etc. with up to GL_MAX_LIGHTS lights 

如果你想比GL_MAX_LIGHTS燈更多,或者你使用OpenGL 3或更高版本,你會例如,需要將燈光數據作爲制服傳遞到您的着色器程序中。

當我使用過去的陰影時,我已經使用了每個燈光的深度紋理。

要合併它們,您通常會針對每個燈光測試每個片段。如果片段對光線可見(即不在陰影中),則添加光線的貢獻。如果片段處於陰影中(對光線不可見),則不要添加該光線的貢獻。

如果你需要數百個燈或類似的東西,你也可以看看Deferred Shading。 (另請參閱the Wikipedia entry on Deferred Shading。)

+0

感謝您的回覆。我使用的是OpenGL 3.3,並沒有試圖使用數百個燈,並且可以想象我只需要幾個燈就可以一次處於活動狀態。我已經爲每個燈光提供了一個立方體貼圖,但是我想知道如何在着色器中通過它們進行最終渲染,因爲每個燈光都有自己的紋理。唯一想到的就是將每個元素綁定到一個新的元素,比如多紋理,但這看起來很浪費。 – Rebirth 2013-02-18 18:54:59