生活随笔
收集整理的這篇文章主要介紹了
GLSL实现HDR Rendering 【转】
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://blog.csdn.net/a3070173/archive/2008/11/29/3408573.aspx
?
HDR?-?全稱(chēng)High?dynamic?rang,是目前流行的3D特效技術(shù).其基本原理是:雖然在計(jì)算機(jī)圖形中可以使用完全的浮點(diǎn)型來(lái)表示顏色,但之前由于一直受到硬件的限制,從外部載入的紋理格式大多只能以每種顏色成分用一個(gè)字節(jié)來(lái)表示,也就是0-255,當(dāng)這個(gè)低范圍的顏色值轉(zhuǎn)換為浮點(diǎn)型之后就會(huì)導(dǎo)致一定量的顏色間隔,而HDR技術(shù)通過(guò)采用浮點(diǎn)型的外部紋理格式彌補(bǔ)了原來(lái)整型紋理格式所導(dǎo)致的顏色間隔,從而增強(qiáng)了計(jì)算機(jī)圖形的顏色表現(xiàn)能力.當(dāng)然這只是籠統(tǒng)的說(shuō)法,而且每個(gè)人對(duì)同一個(gè)概念的理解也不盡相同,所以我在本文的最后列出了一些個(gè)人認(rèn)為比較有用的參考資料,這里只簡(jiǎn)單描述一下我的HDR?-?OpenGL實(shí)現(xiàn),其實(shí)HDR的理念理解了之后就會(huì)比較簡(jiǎn)單,但真要編碼實(shí)現(xiàn)的話(huà)還是有很多東西需要琢磨. 下面列出的是主要渲染流程:備注(FBO代表Frame?Buffer?Object)1.渲染整個(gè)場(chǎng)景到FBO12.下采樣FBO1到尺寸為原來(lái)1/4的FBO2中3.下采樣FBO2到尺寸為原來(lái)1/8的FBO3中DownSample片元著色器:uniform?sampler2D?g_SceneTexture; void?main() {????gl_FragColor?=?texture2D(g_SceneTexture,?gl_TexCoord[0].st);} 4.對(duì)經(jīng)過(guò)兩次下采樣并保存在FBO3中的內(nèi)容進(jìn)行高斯過(guò)濾,并將處理過(guò)后的圖像??保存在FBO4中(備注:高斯過(guò)濾分為橫向過(guò)濾和縱向過(guò)濾兩個(gè)通道,所以需要一個(gè)FBO5進(jìn)行過(guò)渡)高斯過(guò)濾片元著色器:const?int?g_iWeightNumber?=?17; ????????????????????????????????????uniform?sampler2D?g_DecalTexture;uniform?bool?g_bFilterModel; uniform?float?g_aryWeight[g_iWeightNumber];?uniform?vec2?g_aryVerticalOffset[g_iWeightNumber];??uniform?vec2?g_aryHorizontalOffset[g_iWeightNumber];???? void?main() {????vec4?vec4Sum?=?vec4(0.0);????if?(g_bFilterModel) ????{????????????????for(int?i?=?0;?i?<?g_iWeightNumber;?++i) ????????{????????????vec4Sum?+=?texture2D(g_DecalTexture,?gl_TexCoord[0].st?+?g_aryVerticalOffset[i])*g_aryWeight[i];????????}????}????else ????{???????????????????for(int?i?=?0;?i?<?g_iWeightNumber;?++i) ????????{????????????vec4Sum?+=?texture2D(g_DecalTexture,?gl_TexCoord[0].st?+?g_aryHorizontalOffset[i])*g_aryWeight[i];????????}????} ????gl_FragColor?=?vec4Sum;} 5.FBO4中的內(nèi)容與FBO1中的內(nèi)容進(jìn)行特效處理和ToneMapping以將高動(dòng)態(tài)范圍的顏色值映射對(duì)低動(dòng)態(tài)范圍以便于顯示.ToneMapping片元著色器:const?float?g_fGamma?=?1.0/2.0; uniform?float?g_fBlurAmount;????uniform?float?g_fRadialEffectAmount;????uniform?float?g_fExposure;??uniform?sampler2D?g_SceneTexture;uniform?sampler2D?g_BlurTexture; vec4?CaculateRadial(vec2?p_vec2TexCoord,int?p_iSampleNumber, ??????????????float?p_fStartScale?=?1.0,?float?p_fScaleMul?=?0.9) {????????vec4?vec4TempColor?=?vec4(0.0);????float?fCurrentScale?=?p_fStartScale; ????vec2?vec2TempTexCoord?=?vec2(0.0);????????????for(int?i?=?0;?i?<?p_iSampleNumber;?++i)? ????{????????vec2TempTexCoord?=?(p_vec2TexCoord?-?0.5)*fCurrentScale?+?0.5;??????????vec4TempColor?+=?texture2D(g_BlurTexture,?vec2TempTexCoord);????????fCurrentScale?*=?p_fScaleMul;????}????vec4TempColor?/=?float(p_iSampleNumber); ????return?vec4TempColor; } float?CaculateVignette(vec2?p_vec2Position,?float?p_fInner,?float?p_fOuter) {????float?L?=?length(p_vec2Position); ????return?(?1.0?-?smoothstep(p_fInner,?p_fOuter,?L)?); } void?main() {????vec4?vec4SceneColor?=?texture2D(g_SceneTexture,?gl_TexCoord[0].st);?????????vec4?vec4BlurColor?=?texture2D(g_BlurTexture,?gl_TexCoord[0].st);???????????vec4?vec4RadialEffectColor?=?CaculateRadial(gl_TexCoord[0].st,?30,?1.0,?0.95);??????????????vec4?vec4Temp?=?lerp(vec4SceneColor,?vec4BlurColor,?g_fBlurAmount);????????vec4Temp?+=?vec4RadialEffectColor*g_fRadialEffectAmount;????????vec4Temp?*=?g_fExposure;????????vec4Temp?*=?CaculateVignette(gl_TexCoord[0].st*2.0?-?1.0,?0.7,?1.5);????????vec4Temp.rgb?=?pow(vec4Temp.rgb,?vec3(g_fGamma));????????gl_FragColor?=?vec4Temp;} Demo效果截圖:exe文件:http://www.fileupyours.com/view/219112/GLSL/HDR%20Rendering.rarVC9運(yùn)行庫(kù):http://www.fileupyours.com/view/219112/GLSL/VC9RunningLib.rar參考資料:1.DirectX?SDK?Sample?-?HDRLighting(備注:這個(gè)可以從DirectX?SDK中獲得)?????????2.Nvidia?SDK?10.5?- HDR(備注:Nvidia SDK可以在Nvidia的網(wǎng)站上免費(fèi)下載)
總結(jié)
以上是生活随笔為你收集整理的GLSL实现HDR Rendering 【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。