陰影體是一種動態陰影技術。
仔細一看,這玩意兒其實很簡單。
利用的模擬緩衝的功能,把陰影體畫進模板緩衝即可。
這要求計算出物體對著光線的輪廓。
本來覺得,怎麼樣高效地求出這個輪廓,發現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 靜夜思床前明月光 疑是地上...