日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

使用GLSL实现雾化的效果

發(fā)布時(shí)間:2025/7/25 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用GLSL实现雾化的效果 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

from:http://www.cnblogs.com/dawn/archive/2010/03/31/1701327.html

1 為什么需要在GLSL中實(shí)現(xiàn)霧的效果?

  D3D10已經(jīng)不再支持固定管線的繪制了,所有的繪制都得使用著色器語言。OpenGL雖說仍然支持固定管線,但以后難說。因?yàn)橼厔萑绱?#xff0c;所以學(xué)習(xí)沒有壞處。

另外,我的場景使用Shader寫的,固定管線的Fog對其無效,自然得自己用著色器寫霧的效果了。

?

2 如何進(jìn)行呢?-----〉當(dāng)然是上網(wǎng)查資料了。

  網(wǎng)上的http://www.ozone3d.net/tutorials/glsl_fog/?那篇文章寫得還不錯(cuò),但基本是照抄GLSL橙皮書9.6節(jié)的,給的Demo也無法正常運(yùn)行。不過還是給我了不少幫助。

?

3 AMD的RenderMonkey不失為一個(gè)調(diào)Shader程序的好工具,調(diào)好后再加到項(xiàng)目里,節(jié)省了不少調(diào)試的時(shí)間。

以下是GLSL霧化-VS方面的代碼----------------------------------------------------------------------

uniform vec4 vViewPosition;?????? //攝像機(jī)的位置

varying float fogFactor;????????????? //霧的權(quán)重


void main(void)
{
??? gl_Position = ftransform();
??? gl_TexCoord[0] = gl_MultiTexCoord0;?
????
??? const float LOG2 = 1.442695;
???? float fogDensity = 0.001;????????????? //這個(gè)參數(shù)代表了霧的濃度,越大霧越濃
??? //gl_FogFragCoord = length(vViewPosition.xyz-gl_Vertex.xyz);?? //計(jì)算視點(diǎn)與頂點(diǎn)的距離

??? gl_FogFragCoord = abs(gl_Position.z);???????????????????????????????????? //這樣獲得距離效率較高


??? fogFactor = exp2( -fogDensity * fogDensity *???????????????????????????? //計(jì)算霧的權(quán)重
?????? gl_FogFragCoord * gl_FogFragCoord * LOG2 );
??? fogFactor = clamp(fogFactor, 0.0, 1.0);???????????????????????????????????? //越界處理
????
}

----------------------------------------------------------------------VS-End

以下是GLSL霧化-PS方面的代碼----------------------------------------------------------------------

uniform sampler2D Texture0;

varying float fogFactor;?
void main (void)
{
??? vec4 fogColor??? = vec4(0.0,0.4,0.6,1.0);
??? vec4 finalColor = texture2D(Texture0, gl_TexCoord[0].xy);
??? gl_FragColor???? = mix(fogColor, finalColor, fogFactor );??????? //根據(jù)霧的權(quán)重與finalColor 做混合操作
}

----------------------------------------------------------------------PS-End

4 最后效果

RenderMonkey中的效果

?

本人參與的海水項(xiàng)目中的效果(海水使用Shader著色,所以霧化也需用Shader):


總結(jié)

以上是生活随笔為你收集整理的使用GLSL实现雾化的效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。