使用GLSL实现雾化的效果
from:http://www.cnblogs.com/dawn/archive/2010/03/31/1701327.html
1 為什么需要在GLSL中實現霧的效果?
D3D10已經不再支持固定管線的繪制了,所有的繪制都得使用著色器語言。OpenGL雖說仍然支持固定管線,但以后難說。因為趨勢如此,所以學習沒有壞處。
另外,我的場景使用Shader寫的,固定管線的Fog對其無效,自然得自己用著色器寫霧的效果了。
?
2 如何進行呢?-----〉當然是上網查資料了。
網上的http://www.ozone3d.net/tutorials/glsl_fog/?那篇文章寫得還不錯,但基本是照抄GLSL橙皮書9.6節的,給的Demo也無法正常運行。不過還是給我了不少幫助。
?
3 AMD的RenderMonkey不失為一個調Shader程序的好工具,調好后再加到項目里,節省了不少調試的時間。
以下是GLSL霧化-VS方面的代碼----------------------------------------------------------------------
uniform vec4 vViewPosition;?????? //攝像機的位置
varying float fogFactor;????????????? //霧的權重
void main(void)
{
??? gl_Position = ftransform();
??? gl_TexCoord[0] = gl_MultiTexCoord0;?
????
??? const float LOG2 = 1.442695;
???? float fogDensity = 0.001;????????????? //這個參數代表了霧的濃度,越大霧越濃
??? //gl_FogFragCoord = length(vViewPosition.xyz-gl_Vertex.xyz);?? //計算視點與頂點的距離
??? gl_FogFragCoord = abs(gl_Position.z);???????????????????????????????????? //這樣獲得距離效率較高
??? fogFactor = exp2( -fogDensity * fogDensity *???????????????????????????? //計算霧的權重
?????? 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 );??????? //根據霧的權重與finalColor 做混合操作
}
----------------------------------------------------------------------PS-End
4 最后效果
RenderMonkey中的效果
?
本人參與的海水項目中的效果(海水使用Shader著色,所以霧化也需用Shader):
總結
以上是生活随笔為你收集整理的使用GLSL实现雾化的效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GLSL实现滤镜效果
- 下一篇: GLSL预定义变量