陰影體(陰影錐)是三維計(jì)算機(jī)圖形中所使用的一種技術(shù),始于1977年,用于在繪制的場(chǎng)景中加入陰影。它通常被認(rèn)為是現(xiàn)代三維圖形硬件的能力下的最實(shí)用的通用實(shí)時(shí)陰影系統(tǒng)之一,并已隨著毀滅戰(zhàn)士3而流行開(kāi)來(lái)。
圖1.陰影體示意圖
陰影體將虛擬世界分成兩部分;在某光源的陰影中的部分和不在陰影中的部分。
[
編輯]構(gòu)造
要構(gòu)造一個(gè)陰影體,先從光源投射一條射線穿過(guò)產(chǎn)生陰影的物體中的每個(gè)頂點(diǎn)到某個(gè)點(diǎn)(通常在無(wú)窮遠(yuǎn)點(diǎn))。這些射線一起組成一個(gè)體;每個(gè)該體中的點(diǎn)都在陰影中,所有在外部的物體被該光源照亮。
實(shí)際的陰影體如下計(jì)算:
- 找到所有的
輪廓邊(將前向面和后向面隔開(kāi)的邊)
- 將所有的輪廓邊向遠(yuǎn)離光源的方向伸展形成一個(gè)四邊形。
- 加入前蓋和后蓋到這些表面上形成一個(gè)閉合體(不是必要的,是否采用取決于所采用的實(shí)現(xiàn)方法)
當(dāng)前的研究和實(shí)現(xiàn)方法側(cè)重于使用硬件的
模版緩存(stencil buffer)來(lái)優(yōu)化算法以利用硬件加速 - 參看
模版陰影體。
為測(cè)試?yán)L制的圖像的給定像素是否在陰影中,陰影體本身需要被繪制,但它是繪制到模板緩存,而不是最終的圖像中。對(duì)于每個(gè)陰影體中的前向面,模板緩存中的值是增加的;對(duì)于后向面,它是減少的。
一旦所有陰影體中的面被繪制到模版緩存,任何值非零的像素將處于陰影中。
要理解其原因,考慮從像素到屏幕的光線反向回到物體的射線 - 若它穿入陰影體,它將會(huì)穿過(guò)一個(gè)前向面,所以模版緩存對(duì)應(yīng)像素的值會(huì)增加。若它又穿出陰影體(通過(guò)一個(gè)后向面)該值將會(huì)再次減少。
但是如果該像素在陰影中則該值只在它從后面離開(kāi)陰影體時(shí)被減少,所以該值非零。
圖1顯示了一個(gè)包含一個(gè)鏡頭,一個(gè)光源,一個(gè)陰影產(chǎn)生物體(藍(lán)色圓圈)和三個(gè)陰影接受物體(綠色的方塊),全部用二維示意。粗黑線表示陰影體的輪廓。從相機(jī)(笑臉)投射的線表示視線。
該視線首先擊中物體a;在該點(diǎn)它沒(méi)有達(dá)到陰影體的任何面,所以幀緩存會(huì)有0值 - 不在陰影中。在點(diǎn)1陰影體的一個(gè)前向面被穿過(guò)因而增加了模版緩存中的值。然后我們擊中物體b;在該點(diǎn)我們?cè)诰彺嬷杏幸粋€(gè)值為1,所以該物體在陰影中。沿著視線繼續(xù)前進(jìn),我們會(huì)在點(diǎn)2到達(dá)陰影體的后向面,因而把模版緩存中的值減少到0。最后我們擊中物體c,模版緩存中的值又是0,所以該物體也不在陰影中。
該算法的一個(gè)問(wèn)題在于若相機(jī)(眼睛)本身在陰影體中則該方法回失敗 - 視線首先穿過(guò)陰影體的后向面,將模版緩存中的值減少1,使得它在到達(dá)物體c的時(shí)候有非零值,雖然該物體不應(yīng)該在陰影中。
這個(gè)問(wèn)題的一個(gè)解決辦法是從無(wú)窮遠(yuǎn)的某點(diǎn)返回到相機(jī)。該技術(shù)由一些人獨(dú)立發(fā)現(xiàn),但是由
John Carmack推廣,并經(jīng)常被稱為
Carmack的翻轉(zhuǎn)。
模版陰影體,描述了如何使用模版緩存實(shí)現(xiàn)陰影體算法
輪廓邊
- 陰影映射,一個(gè)較簡(jiǎn)單的技術(shù)
[
編輯]外部鏈接
posted on 2008-01-01 08:25
姚明 閱讀(821)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
圖形學(xué)