2012-03-12 29 views
7

據我所知,陰影貼圖是通過從光線角度渲染場景來創建深度貼圖來完成的。然後,您從攝像機的POV重新渲染場景,並且爲場景中的每個點(GLSL中的片段)計算從那裏到光源的距離;如果它與你陰影地圖中的相符,那麼它就在光線中,否則它就在陰影中。如何爲多個點光源使用單個陰影貼圖?

我剛剛通過this tutorial閱讀了解如何使用點/全向光進行陰影映射。

根據第12.2.2它說:

我們使用一個單一的陰影貼圖的所有光源

然後12.3.6下,它說:

1 )計算從當前像素到光源的平方距離。
...
4)將計算出的距離值與獲取的陰影圖值進行比較,以確定我們是否處於陰影中。

這大致就是我上面所說的。

我沒有得到的是,如果我們將所有的燈光都映射到一個陰影圖中,那麼我們需要哪種光線來比較距離?烘烤到地圖上的距離不應該與任何東西相對應,因爲它是所有燈光的混合物,不是嗎?

我確定我錯過了一些東西,但希望有人能向我解釋這一點。


此外,如果我們使用單個陰影貼圖,我們如何將它融合到所有光源中?

對於單個光源,陰影貼圖只是存儲最近的物體到光源的距離(即深度圖),但是對於多個光源,它將包含什麼?

回答

5

你剪了一句簡短過早:

我們使用一個單一的陰影貼圖的所有光源,具有多路渲染創建圖像 和每個光 源進行一次傳球。

因此,陰影貼圖一次只包含一個光源的數據,但它們只使用一張貼圖,因爲它們一次只渲染一個光源。

我認爲這會流入你的第二個問題 - 光是可以疊加的,所以你只需將多個燈的結果相加就可以了。在GPU Gems的情況下,它們直接加在幀緩衝區中,毫無疑問,因爲當時GPU上可用的存儲紋理採樣器數量相對有限。現在,您可能想要在幀緩衝區中組合並直接在片段着色器中進行組合。

由於浮點舍入誤差積累,通常還應用「像素點亮,如果它小於或等於陰影緩衝區中的距離加上一點點」而不是完全相等。

+0

我認爲這句話的其餘部分意味着他們只是通過渲染到每個光源的相同地圖(可能是附加地)來構建陰影貼圖;不是他們清除並重新使用它。現在更有意義了......這真是一個恥辱 - 我真的希望能夠用一個陰影圖離開:p – mpen 2012-03-12 03:03:31

+0

如果你翻轉並使用通常稱爲延遲渲染的東西,那麼你可以這樣做。您從相機渲染場景以輸出深度+法線+每個像素的一些表面信息,然後爲每個燈繪製全屏幕四邊形,以有效地遍歷相機渲染。即使您的GPU只能輸出8bit RGBA(在移動世界中仍然很常見),您可以在多次通過中執行第一位到多個紋理。 – Tommy 2012-03-12 03:12:11

+0

太好了。你爲我打開了一個全新的蠕蟲罐。我正在製作遊戲,而且大部分對象都是靜態的(或很少發生變化),所以我正在考慮爲所有靜態對象預先計算陰影貼圖,保留一份副本,並僅針對移動對象更新它。我希望支持儘可能多的燈光,所以我不認爲每秒60次從不同角度重現場景100次對我來說是可能的。但是陰影貼圖會佔用活動紋理,不是嗎?我必須一次把所有的人都綁定在最後的渲染過程中,不是嗎? – mpen 2012-03-12 03:37:04