2014-02-26 82 views
2

我在寫一個延遲渲染器,想到幾件事情。渲染將至少進行兩遍:首先渲染位置,法線和漫反射+高光顏色爲三種不同的紋理。然後我在最後一遍合併這些光線,併爲每個光線做照明並添加後處理效果以產生最終圖像。這部分我雖然工作。(GLSL)渲染多個同時從不同的角度通過

問題在於:如何處理陰影?幼稚的做法是爲每個活動光線分別渲染一個深度圖。所以這意味着儘可能多的通行證,因爲有燈。這似乎擊敗了延期着色的全部目的,以一次完成所有照明。

如果我可以一次渲染深度圖,那麼一個更好的方法是。但是,這甚至有可能嗎?因爲要從不同的角度呈現場景,需要進行與主攝像機相同的剔除。因此,從每個光源的角度渲染需要與呈現主攝像機視圖一樣多的場景圖遍歷和頂點緩衝區綁定。所以這是非常昂貴的。

但是,這樣做的正確方法是什麼?根據多遍渲染陰影貼圖的標準方法是什麼?是否真的有必要爲每個會給場景帶來陰影的光線進行單獨的渲染,還是有更好更快的方法來計算所有陰影的總和。有沒有辦法在單個着色器通道中對多個幀緩衝區執行多個透視圖渲染?

另外我想這將是一個好主意,爲每個照明通道綁定兩個緩衝區:一個包含前一遍的結果總和和一個包含像素距離的結果。然後,所有照明過程的產品將成爲可傳遞給最終渲染過程的陰影強度映射。

最終渲染過程只會在整個屏幕上渲染一個單獨的四邊形,並在其上進行後處理和着色。所以至少有2 + 1次傳球。有8個燈光意味着每個畫面都要渲染10次?

回答

2

首先,我不喜歡「陰影強度」或結合陰影的想法。陰影是缺乏光。只有在有光的地方纔加燈光,而且不需要擔心陰影。實際上,這僅僅意味着在應用每個燈光時應用陰影。

可以使用多個視口擴展和幾何着色器同時渲染多個陰影貼圖。你也可以使用實例化和渲染紋理數組。 「OpenGL Insights,第19章 - 大量渲染陰影投射燈」讓人想起(因爲我是同一本書中另一章的作者)

大多數遊戲做的事情是實現某種可見性數據結構,以便您不必繪製您認爲不可見的東西。這在渲染陰影貼圖時非常有用。您可能想要考慮將相同燈光可見的幾何圖形進行分組,併爲這些燈光一次渲染陰影貼圖。這樣可以最大限度地減少不影響陰影的幾何體。如果在場景的完全獨立區域中大多數燈光都帶有陰影,那麼可見性數據結構將比使用多個視口渲染保存的頂點處理時間更重要。

具有延遲渲染的渲染燈通常不會使用單個全屏四元組完成。延遲着色的主要優點之一是能夠對照明貢獻進行本地化。一個非常基本的級別,可以在像素上繪製一些幾何圖形,這些像素可以由燈光點亮,如小四方形或圓形。然後只有這些像素的片段着色器纔會執行任何昂貴的照明計算。接下來,您可以通過深度限制碎片來開始剔除。使用表示光線影響範圍的網格很常見。

一些相關的鏈接(只是我對谷歌搜索的東西,看着沒有特定的順序像樣的)...