基于Qt的OpenGL可编程管线学习(19)- 雾
雾的效果,这里只对牛头的模型进行了雾化,如下图所示
距离模型越近,越清晰
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);
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。