Shadow Volume DX8
Shadow Volume是一種可以使實現陰影任意投射的高級方法。主要借助模板緩存(stencil buffer )實現對陰影區域的標識。最后借助標識進行alpha混合繪制陰影區域。
?
大致思路:
在Shadow Volume中最重要的就是找出物體相對于燈光的輪廓。然后為所有的輪廓邊構造四邊形。四邊形的構造是這樣的,將四邊形的一邊與輪廓邊對齊,然后將另一邊(相對于輪廓邊的邊)沿著燈光照射的方向移動到足夠遠,這樣就形成一個很大的四邊形。所有輪廓邊生成的四邊形將組成一個陰影體積,然后用這些四邊形采用某種方式渲染到stencil buffer里面以實現陰影區域的標識。
?
重點細節:
在輪廓識別中我目前掌握的兩種方法。輪廓邊是這樣一種邊。與邊相鄰的一個面朝向光源,另一個面背向光源。
- 一種是構建一個邊與兩個與邊相鄰的面法線的結構體,然后分別用兩個面的法線與燈光方向做點積,如果兩個點積的值的符號不同,便可以證明此邊是輪廓邊。因為點積的幾何含義是:如果點積大于0表明面朝向燈光,如果點積小于0表明背向燈光,
- 另一種是將所有面朝光源的面的邊加入到一個邊列表,如何將邊加入邊列表,是這樣,每個面有3條邊,每個邊有兩個點,每個點都有索引,我們用兩個點的索引表示邊,加入到邊列表。這樣一般一個面會加入3條邊,也就是6個點索引。我們在加入邊列表的時候還需做這樣的校驗,如果列表中存在即將加入的邊,就將已經存在的邊去掉(即將加入的邊也就不加入了)。這樣最后在邊列表存在就是邊輪廓了。這是因為所有面向光源的面在非輪廓邊上都有一次重復。所以所有非輪廓邊肯定會去除。
????? 2.??? 模板緩存對陰影區域進行標識
?
首先場景正常渲染到color buffer和zbuffer中,然后在zbuffer開啟的狀態下,開啟stencil buffer,將stencil buffer比較函數改成總能通過,將通過zbuffer的操作改為增加值。這樣先渲染陰影體積的正面。然后將通過zbuffer的操作改為減一,修改剔除操作為剔除正面,然后渲染陰影體積的背面。最后stencil buffer中所有是1的區域就是陰影區域(stencil buffer初始化為0)。如果stencil buffer是兩面的那么,可以將陰影體積正面和背面同時渲染,當然也就需要將剔除操作去除(否則背面會被剔除)。
?
最后就是制作一個和窗口客戶區同大小的黑色四邊形與stencil buffer中表示的陰影區域進行alpha混合,實現將陰影繪畫出來。四邊形的肯定需要采用XYZRHW格式(即已經經過變換的坐標)。
?
具體案例參照早期DirectX9的Demo? --- Shadow Volume。
?
具體的解說還是要參照詳細教材。
?
?
總結
以上是生活随笔為你收集整理的Shadow Volume DX8的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DesignPattern - 适配器模
- 下一篇: 计算机音乐先点什么,我电脑上有几千首歌,