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...