雾的效果,这里只对牛头的模型进行了雾化,如下图所示


距离模型越近,越清晰


1、线性雾

fragment shader中实现效果,

参数为眼睛到平面的距离,需要传入雾的起始位置和终止位置

floatcalcFogLinear(floatdistance){floatfogAlpha=(distance-M_FogStart)/(M_FogEnd-M_FogStart);fogAlpha=1.0-clamp(fogAlpha,0.0,1.0);returnfogAlpha;}


2、EXP雾

fragment shader中实现,需要传入雾的浓度

floatcalcFogExp(floatdistance){floatfogAlpha=exp(-(distance*M_FogDensity));fogAlpha=clamp(fogAlpha,0.0,1.0);returnfogAlpha;}


3、EXPX雾

fragment shader中实现,需要出入雾的浓度和梯度

floatcalcFogExpX(floatdistance){floatfogAlpha=exp(-pow(distance*M_FogDensity,M_FogGradiant));fogAlpha=clamp(fogAlpha,0.0,1.0);returnfogAlpha;}


眼睛的位置计算

M_EyesPos=V*wordPos;


fragment shader

//计算雾的强度//线性计算//floatfogAlpha=calcFogLinear(abs(M_EyesPos.z/M_EyesPos.w));//EXP方式计算//floatfogAlpha=calcFogExp(abs(M_EyesPos.z/M_EyesPos.w));//EXPX方式计算floatfogAlpha=calcFogExpX(abs(M_EyesPos.z/M_EyesPos.w));vec4lightColor=texture2D(U_MainTexture,M_coord)*ambientColor+texture2D(U_MainTexture,M_coord)*diffuseColor;//+specularColor;gl_FragColor=mix(M_FogColor,lightColor,fogAlpha);


CPU端雾的设置

//设置雾floatnFogStart=1.0f;floatnFogEnd=500.0f;floatnFogColor[]={41.0f/255.0f,71.0f/255.0f,121.0f/255.0f,1.0f};floatnFogDensity=0.008f;//雾的强度floatnFogGradiant=2.0f;//雾的衰减梯度OpenGLCore->glUniform1f(m_Mode2->getLocationHandle("M_FogStart"),nFogStart);OpenGLCore->glUniform1f(m_Mode2->getLocationHandle("M_FogEnd"),nFogEnd);OpenGLCore->glUniform4fv(m_Mode2->getLocationHandle("M_FogColor"),1,nFogColor);OpenGLCore->glUniform1f(m_Mode2->getLocationHandle("M_FogDensity"),nFogDensity);OpenGLCore->glUniform1f(m_Mode2->getLocationHandle("M_FogGradiant"),nFogGradiant);