2014-03-19 162 views
9

我剛在我的引擎中實現了一個燈光系統。在下面的截圖中,你可以看到在行動一光(黃色方塊):漫射光/陰影

1 要考慮到在光的頂部光照的情況下,其還實施了FOV,將堵塞你的視野之外的任何內容。這就是爲什麼陰影的左側看起來如此關閉。

正如您所看到的,燈光的陰影非常「硬」,因爲它們甚至不會照亮直接觸及範圍之外的區域。 爲了使燈光看起來更好,我申請一個過濾器對他們來說,這幾乎限制了被照亮的範圍內,並且也略有還有iLuminate這個限度內的區域:

2

在黃色的大即使沒有直射光線到達,您也可以看到該區域是如何照亮的。

然而,這種解決方案帶來了一些不良的副作用。正如你可以在下面的截圖中看到,即使沒有光在所有到達的區域,將在點亮它太靠近光源:

10

我想知道是否有什麼辦法通過適當地使用着色器來實現我要做的事情。 我遇到的主要問題來自我如何繪製這些陰影。

1)首先我把結構放在燈的範圍內。

在這一點上,我與頂點的工作,因爲他們明確規定陰影投射項目的區域:) 3

2然後,對於每個對象,我估計他們單獨的陰影: 4

5

6 它們的陰影是由CPU完成的,通過calpulating突起爲身體的每個頂點。

3)然後GPU繪製這些形狀到紋理組成​​最終的影子:

7

我發現的問題是,使這個瀰漫性陰影效果,我需要最終的影子。如果我要計算步驟2)中的漫射陰影,則實體B和C之間會出現光線間隙。

但是,如果我在步驟3中彌散陰影,則不再具有頂點信息,因爲所有我所擁有的信息是3個局部紋理在一個最終紋理中加在一起。

那麼,有沒有辦法做到這一點?我的第一個想法是將變化傳遞給碎片生成器來計算有多少光進入黑暗區域,但是由於我將在最終的影子上處理這個信息,該信息沒有頂點信息,所以我完全失去了什麼我應該使用這種方法。

我對這種方法可能完全錯誤,因爲我對着色器的使用經驗非常有限。

這裏是什麼,我有一個例子,現在,我的願望: 我有什麼:普通照明withing光半徑(這會導致穿牆夾光 7

我想要什麼:陰影越強,距離光線越遠距離越遠 7

+0

s/difuse/diffuse/ –

+0

感謝您指出錯字。 Fix'd。編輯:我無法輸入! :( – Leo

+0

我想我們需要更多關於你在哪裏做算法部分的信息。你計算CPU上的影子卷嗎? –

回答

1

我認爲不管你做什麼,你都必須對場景中的區域進行不同的光衰減計算不能直接看到原始光源,我不確定你是如何實際應用的將陰影音量添加到場景中,但是當您生成陰影音量時,您可能可以執行諸如對邊緣進行分類等操作。他們是從牆上還是從燈光到角落?),並相應地對待它們。

總之,我不認爲有任何聰明的着色器特定的技巧,你可以解決這個問題。這是您使用的算法的限制,因此您需要改進算法以考慮陰影體中邊緣的不同特性。

---編輯---

好吧,我想你最好的選擇將是創建兩個影子卷(或相當陰影區域,因爲我們在2D正在努力)。一個會像現在一樣,另一個會更小 - 你會想要排除處於「柔和」陰影的區域。然後在片段着色器中有三個類別:全部陰影,柔和陰影和未被遮蔽。

要創建第二個陰影貼圖,我認爲您需要做一些操作,例如爲由角落周圍的光線創建的邊緣添加固定角度。

---編輯#2 ---

我想你可以通過陰影區域的輪廓和場景的外包裝盒解決的對象B和C之間的差距問題。因此,對於每個陰影區域,您都會找到與外框相交的兩個最外面的點,然後丟棄其中的所有線段並將它們替換爲該框的該部分。我覺得我應該能來命名的算法,但它脫離了我的那一刻...

原始場景: Original scene

個人「硬」的陰影: Individual "hard" shadows

現在工會的陰影一起: Union

最後,跟蹤陰影周圍,保持框的邊緣。你想識別的角落是黃色的角落。當你在陰影的周圍尋找時,你想要穿過盒子的邊緣,直到到達對面的角落。不是最容易的事情代碼,但如果你已經遠遠得到這個我認爲你可以或者看着辦吧:)

Silhouette

,可能更容易簡單地考慮照亮的區域。例如,你可以做一些事情,如採取場景框和工會陰影區域的區別。這通常會給你多個多邊形;拋棄除了包含光之外的所有東西,因爲其餘的都是虛假的差距。

+0

是的,我想我需要改進算法,但這正是我所要求的。 關於着色器的問題只是對我可能忽略或忽略的着色器的一些缺失概念或原理進行雙重檢查,因爲正如我所說的,我的經驗非常有限。 – Leo

+1

@ user2215331 Ok編輯相應... –

+0

我已經實現了類似的東西。如果您查看第一張截圖,右側陰影的邊緣會以一定角度擴散,而漫射區域會隨着遠離角落而變大。我試圖使用這種方法,但問題仍然與問題中所述的相同:如果在處理小陰影(即仍在使用頂點的過程的最後一步)時構造軟陰影,則會增加柔和陰影我不會等於我正在尋找的那麼大的軟陰影。真正的問題是如何從產生的總影子中構建這個軟陰影。 – Leo