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