irricht陰影體實現筆記

2021-06-19 14:30:00 字數 1432 閱讀 1773

陰影體是一種動態陰影技術。

仔細一看,這玩意兒其實很簡單。

利用的模擬緩衝的功能,把陰影體畫進模板緩衝即可。

這要求計算出物體對著光線的輪廓。

本來覺得,怎麼樣高效地求出這個輪廓,發現irricht實現得非常簡單,同時也意味著不夠優化(筆者看的irricht版本是1.7的,可能最新的版本優化了)

irricht直接取面對光線的那些多邊形,然後利用這些多邊形構造陰影體。(可以想像,陰影體是背對光線延伸至無窮遠,irricht的"無窮遠"是1000)

irricht的陰影體定義成乙個物件cshadowvolumescenenode

這個物件會做為canimatedmeshscenenode的子節點,進入場影管理,

並在onregister時,進入場影的shadow list

cshadowvolumescenenode 會去取canimatedmeshscenenode當前幀對應的mesh,並計算陰影體

irricht首先渲染所有的物體,例如canimatedmeshscenenode

然後才渲染陰影體。

把陰影體畫進模板,然後再畫乙個矩形,把整個渲染遮住,在畫這個矩形時,會做模板測試,

只有模板快取中的陰影體會被渲染,在視覺就形成了陰影。

這樣就可以了?

這裡還需要做乙個簡單的處理。

接下來的東西說起來拗口,但一畫圖就非常簡單了。

圖中的矩形是物體,因為光源而產生的陰影,物體1和物體3處於陰影中,而物體2顯然不處於陰影當中。

如果不做處理,根據模板快取裡畫出的陰影體直接渲染,則會錯誤地把物體2也畫成處於陰影的狀態。

irricht的處理如下:

cshadowvolumescenenode::render --> copengldriver::drawstencilshadowvolume

這個函式中有這麼一段**

glstencilop(gl_keep, incr, gl_keep);

glcullface(gl_front);

gldrawarrays(gl_********s,0,count);

glstencilop(gl_keep, decr, gl_keep);

glcullface(gl_back);

gldrawarrays(gl_********s,0,count);

會畫兩次,多邊形可以認為有兩個面(front back),

開啟深度快取,做比較,類似出棧入棧,在物體之後的陰影體多邊的,遇到背面+1, 遇到正面-1,

最終,如果為0,表示該點不同陰影體之內,如果不為0,就需要加入陰影效果。

這樣就可以正確把陰影效果表現出來。

求得陰影體後往模板裡畫就可以了?

這裡還需要做乙個簡單的處理。

QT筆記之實現陰影視窗

方法一 實現 在視窗建構函式中加入 setattribute qt wa translucentbackground 保證不被繪製上的部分透明 重寫void paintevent qpaintevent event void qt test paintevent qpaintevent event ...

TextView shadow 陰影實現

直接上 1 實現普通效果 textview android layout width match parent android layout height match parent android shadowcolor ff0000 android shadowdx 3 android shado...

css實現文字陰影,以及邊框陰影

1 文字陰影 text shadow 1px 1px 1px lightgray text shadow 1px 1px 1px lightgray 第乙個1px 是向x座標方向的偏移 第二個1px 是向y座標方向的偏移 第三個1px 是模糊距離 第四的引數 顏色 例 1 靜夜思床前明月光 疑是地上...