先上圖,再說點別的。
BLOOM開
BLOOM關
在IRRLICHT中實現BLOOM,和其它引擎中沒有太多的不同。 SHADER還是那個SHADER。
關于BLOOM的算法,也就那樣了,沒有特別之處,況且,我這BLOOM很暴力
render scene to texture.
1/4 downsample 選擇暴光像素
h_blur 7次采樣 和權重混合
v_blur 7次采樣 和權重混合
compose 兩圖疊加
下面說說我在irrlicht中實現post processing的方案。
在irrlicht中是沒有屏幕對齊四邊形節點的,如果要特殊擴展,就只能修改代碼了。我是盡量保證自己不修改IRR一行代碼, 除非是真正使用時,要對效率進行優化。前現實現的GPU蒙皮,水面,鏡面等,都沒有修改過一行代碼, 因為我不想因為自己的一時需求,而改動了那一堆。 當我真的需要改動irrlicht才能達到目標的時候,表示irrlicht中我使用的部分,可以退休了。
渲染場景的時候,我們通常在使用addXXXXSceneNode的時候,都默認不傳父節點。這樣就是默認的場景根節點。但是,當我們要做post process的時候,就需要對場景中的物體進行顯示的開和關, 于是,我們為了很快速地控制, 于是將普通場景節點多加了一個父節點, 而post processing作為場景的兄弟節點, 這樣在渲染的時候,就可以方便地進行相關控制了。
大概是這樣的
RootSceneNode
PostProcessingNode SceneOjbectsNode
Obj1… Obj2….Obj3…
流程:
關閉 PostProcessingNode , 渲染 SceneOjbectsNode 下所有的物體到RT上。
關閉 SceneOjbectsNode, 打開PostProcessingNode, 進行一系列的后期效果處理。
在irrlicht中是沒有提供屏幕對齊四邊形繪制的, 如果手工構建,就很麻煩。 所以,我采用的是一種很常見的手法, 即通過UV坐標來計算最最終的頂點坐標值。
VS的輸出,是規一化坐標系, 即X,Y是處于 (-1,1)之間的, 于是。 我們只需要 pos = (uv-0.5)*2; pos.y = –pos.y;就可以了。
最近一直在加班,沒時間整理出代碼。 有興趣的朋友可以加下面的群
Irrlicht Engine-China
254431855