2013-03-29 173 views
3

我一直想知道如何用OpenGL實現這一點:2D陰影映射

example

  1. 我有地圖,有平坦的地面和牆壁。這裏的每一件事都是2D,沒有3D幾何,只有2D組成地圖。

  2. 使用投影陰影的多邊形的頂點來定義可視區域。

  3. 陰影定義了視野,但由於具有牆壁的細胞阻塞了視野,因此它們也變暗。我可以在陰影上繪製牆壁,但這樣做會在視野外顯示均勻的牆壁。

我被建議用陰影映射來解決這個問題。我應該將2D場景渲染成4種不同的1D紋理,以保持與第一個碰撞表面的距離。 問題是我不知道如何將2d場景的投影渲染到1D紋理中。如果我使用,例如: gluLookAt(x,y,0.0,0.0,x,y + 1,0.0,0.0,1.0);

要呈現頂視圖,結果仍然是2D。此外,由於所有頂點都在同一平面上,因此所有表面都將與攝像機垂直。

對於如何進行這些二維到一維投影,您有任何提示或想法嗎?我一直在Google上搜索類似這樣的場景,但所有這些都在3D環境中。

+0

究竟在哪裏與影子腳輪相互作用的「光源」? –

+0

該字符是光源。陰影的目的是爲了模擬角色可以從他站在哪裏看到的東西。 – Leo

+0

難道你不能放棄從2D到1D的座標嗎?這將相當於一個正交投影,對嗎? – fluffels

回答

0

陰影貼圖假定爲定向光源或聚光燈,並且您有一個點光源。但是因爲你只需要在地板上留下陰影,所以你可以將它建模成一個聚光燈,地面以上2米,向下。所有的牆壁必須至少有2米高。在第一個陰影貼圖過程中,您可以將地板和所有牆壁渲染到陰影緩衝區中。

但是,我不會去陰影映射,而是使用體積陰影。如果您從3D到2D,3D體積將變成2D多邊形。

假設所有的牆都在規則的網格上,我們可以計算從玩家的位置P到牆的所有角落的視圖光線。對於每個角落,存放相鄰的牆壁,並忽略背離玩家的所有牆壁。然後投射從P到每個角落的光線,將光線轉換爲極座標,並按逆時針方向按角度排序。現在通過這個有序列表以一個完整的運動,並建立陰影多邊形。

陰影多邊形由此列表中的任一角點組成,或者由a)平行於牆的線和b)穿過P和角的直線之間的交點組成。唯一讓這有點複雜的是你必須找到收到陰影的牆。由於輸入非常小,我可能會以強力開始(檢查每個牆的角落),並看看它的速度有多慢。請注意,只有面向玩家的牆可以投射陰影。另外請注意,距離玩家最近的點不需要可見。

它可能會看起來非常酷,與移動的角色。