2010-08-27 72 views
7

當我讀RedBook時,我一直很困惑,openGL在場景中可以有最多8個燈(數量取決於實現,但應該是8號)。OpenGL燈限制

但我可以想象會需要更多燈光的情況數量,所以我認爲在遊戲開發中有一個技巧。

例如,您的街道非常長,有50個大燈,或者您可以有20名居民都使用手電筒。你真的如何模擬這些情況?這裏存在一個問題,那就是光線只能照亮網格的一部分,而不是光源和物體之間的整個圓錐體,所以如果我們沒有100%的潔淨空氣,也必須進行某種模擬。這樣做的方式是什麼,並且遊戲運行平穩?(我還讀到使所有8個燈都可以殺死FPS)

回答

10

8燈是固定GL管線的限制,您可以在其中啓用它們中的每一個,設置模式,參數等。現在,您擁有像素着色器,並且在着色器中完成照明。在那裏你可以使用大量的動態(不烘焙成紋理)燈。你只需要充分提供所有這些燈的參數(也許,在紋理中),並測試你的着色器能夠處理多少光。另外,在着色器中,你可以挑選太弱的燈光(對像素值貢獻太少)或者太遙遠的燈光。

更新:具有分支的複雜着色器甚至可以生成燈光(想想長長的街道或聖誕樹)。它可能比提供大量參數更有效。

+0

更新:這項技術被討論了很多,這裏有一個鏈接: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=267432 – alxx 2010-08-27 11:59:12

+0

弱燈不是着色器功能,因爲啓用/禁用燈光的功能可以在設計燈光管理器的固定管線之外完成,只啓用重要燈光。 – Luca 2010-08-31 16:35:14

+0

光管理器啓用/禁用整個場景的燈光。像素着色器可以做到每個像素,看到不同?順便說一下,傳統流水線中的8個燈是每個頂點的,而着色器則是每個像素的燈光 - 完全不同。 – alxx 2010-08-31 17:38:05

4

遊戲中使用的技巧之一是模擬具有紋理的燈光。

因此,在您的街燈示例中,「點亮」區域實際上會是更明亮的紋理圖像。只有最近的燈光才能獲得正確的效果。

也有類似的方法,其中具有透明圓錐體的半透明紋理或紋理與場景重疊以產生相同的效果。

不要忘記,實時計算陰影等意味着必須從光源的角度渲染場景,以計算任何給定位置的光線強度。因此,對於8個光源,您正在渲染場景(或場景的部分場景),最多可提供8倍的,然後實際渲染場景進行顯示。即使這是在GPU上完成,而不是在CPU上完成,也是非常昂貴的。

5

照明是計算機圖形學中一個非常複雜的主題。

真正重要的是,物體照明,模擬真實世界的照明或我們所針對的效果。照明環境可以由許多來源組成,以便逼近我們試圖實現的真實效果。

OpenGL照明實現是動態光源,它是光點抽象,允許「渲染」(即給出顏色)渲染的頂點(用於渲染三角形)。 ...頂點被照亮,獲得每種光線的顏色貢獻。

正如你所提到的,渲染過程需要更多的時間,我們啓用了更多的燈光。爲了儘量減少這一點,你有不同的可能性

  • 光剔除(不包括對光線的貢獻稍微改變顏色的光),這是使用光屬性(距離,圓錐,衰減,視角和障礙物)確定的。
  • 靜態照明,它使用紋理來模擬永不會移動的物體上的照明。

OpenGL固定光照對頂點顏色有貢獻,頂點顏色用其他頂點顏色插值以便柵格化三角形。在幾何圖形由幾個三角形組成的情況下,每個三角形內部都看不到任何光錐,因爲它的顏色是三種顏色(三個頂點)的插值結果。

爲了實現更精確的照明,軟件應該像確定頂點被燈光着色的方式一樣確定每個片段(像素)的顏色(像素點亮),但正如您所能理解的,可能會有比頂點更多的像素。 一種方法是在光柵化階段計算(使用着色器或OpenGL擴展)光線對幾何圖形每個像素的貢獻,或使用延遲光照確定像素顏色。

延期照明使用多個紋理(對應於視口)來存儲每個顯示像素的光照參數。通過這種方式,您可以在生成圖像後執行光照計算,爲每個像素確定一次像素光貢獻,而不是每個幾何像素一次。