使用GLSL实现雾化的效果
from:http://www.cnblogs.com/dawn/archive/2010/03/31/1701327.html
1 為什么需要在GLSL中實(shí)現(xiàn)霧的效果?
D3D10已經(jīng)不再支持固定管線的繪制了,所有的繪制都得使用著色器語(yǔ)言。OpenGL雖說(shuō)仍然支持固定管線,但以后難說(shuō)。因?yàn)橼厔?shì)如此,所以學(xué)習(xí)沒(méi)有壞處。
另外,我的場(chǎng)景使用Shader寫(xiě)的,固定管線的Fog對(duì)其無(wú)效,自然得自己用著色器寫(xiě)霧的效果了。
?
2 如何進(jìn)行呢?-----〉當(dāng)然是上網(wǎng)查資料了。
網(wǎng)上的http://www.ozone3d.net/tutorials/glsl_fog/?那篇文章寫(xiě)得還不錯(cuò),但基本是照抄GLSL橙皮書(shū)9.6節(jié)的,給的Demo也無(wú)法正常運(yùn)行。不過(guò)還是給我了不少幫助。
?
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实现雾化的效果的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: GLSL实现滤镜效果
- 下一篇: GLSL预定义变量