GLSL實現Glow效果

2021-04-21 12:17:32 字數 2014 閱讀 3272

glow即輝光效果現在已成為3d圖形中乙個引人注目的特效.本文主要介紹如何使用glsl實現乙個典型的glow效果.

實現步驟:1.渲染整個場景到乙個禎緩衝區中

2.將場景中需要進行glow處理的物體繪製第二個fbo紋理a中

3.在fbo紋理a和b之間進行橫和縱"高斯"過濾

4.將進行過glow處理後的fbo紋理a與禎緩衝區中的場景影象以glblendfunc(gl_one, gl_one)方式進行混合處理

glsl檔案功能簡介:

fullscreen.vert - 用於繪製覆蓋整個視口的四邊形以進行glow效果的高斯過濾

filter.frag - 用於橫和縱的高斯過濾

blend.frag - 用於處理過的glowfbo紋理與原始場景影象進行混合

為了直接進行生成glow效果的介紹,這裡假設程式已正確處理了opengl和glsl的初始化.

void renderorigionalscene()

else

renderobject();

}首先讓我們繪製原始場景,由於本demo未繪製除輝光物體外的其它事物,所以此處就直接繪製為進行具有輝光效果的物體.

void renderglowobject()

然後設定繪製目標到fbo紋理a並將欲進行glow處理的物體繪製到上面來,這裡需要注意的是必須根據fbo紋理的尺寸設定乙個

視口使其跟fbo紋理一樣大,以使物體能夠準確地對映到整個fbo紋理上.清除fbo顏色緩衝區和繪製深度緩衝區是必要的,因為

每次繪製到fbo紋理中的影象都不一樣.

void filterglowobject()

下面到glow效果處理的重頭戲,是否能生成完美的輝光效果關鍵就在於此步的處理.但其實也很簡單,主要就是為filter著色器設

置進行合適橫,縱兩次過濾的標誌和繪製目標,然後繪製全視口四邊形,剩下的過濾工作則由glsl的高斯過濾著色器全權負責.

void rendertoscreen()

最後一步無非就是將過濾好的glow紋理與原始場景影象進行混合,當然使用opengl固定功能管線或glsl都可以輕易實現,但首先必

須把視口設定回原來的狀態.

以下是高斯過濾的glsl著色器**,貼上於此以方便讀者查閱.

頂點著色器:

void main()

高斯過濾著色器:

const

int g_ifiltertime = 9; // 過濾次數

const

float g_fgene = (1.0/(1.0 + 2.0*(0.93 + 0.8 + 0.7 + 0.6 + 0.5 + 0.4 + 0.3 + 0.2 + 0.1))); // 衰減因子

uniform sampler2d g_decal;

uniform bool g_bfitermode;

uniform float g_fglowgene;

uniform vec2 g_vec2horizontaldir; // 水平過濾方向

uniform vec2 g_vec2verticaldir;  // 豎直過濾方向

uniform float g_ffilteroffset; // 過濾偏移

void main()

// 進行過濾

vec2 vec2step = vec2filterdir;

for(int i = 0; i

if (g_bfitermode)

else

}混合著色器:

uniform sampler2d g_decal;

void main()

demo效果圖:

參考資料:nvidia opengl sdk 10.5 ****** glow

exe檔案:http://www.fileupyours.com/view/219112/glsl/glow%20demo.rar

GLSL實現水面倒影

使用兩相機,乙個master相機,主要負責場景的渲染,另乙個rtt相機,和master相機建立為鏡面投影相機,用於在和master相機的縱向映象投影,從而獲取master投影場景的逆場景,渲染到紋理,進行鏡面貼圖,實現水面的倒影效果。效果如圖 實現 需要一張天空背景圖,一張water法線圖 vert...

WoW骨骼動畫的GLSL實現

使用指令將頂點的骨骼和權重資訊作為generic attribute屬性傳入給shader物件.glint indexbone glgetattriblocationarb m glprograme,bone glint indexweight glgetattriblocationarb m gl...

Shader學習筆記,通過GLSL實現(一)

最近一直在專心研究利用glsl編寫shader,寫點東西將自己學的總結一下,把自己學習shader的經歷分享一下,希望能對有興趣學習shader的同學有些幫助,但這些玩意還算不上教程,很多都是我自己在學習中的問題以及如何解決的,有什麼不足還請各位指出,想要系統的學習glsl的話還是推薦大家看 ope...