smoothstep(float start, float end, float parameter) linstep(float start, float end, float parameter)此两个函数使用方法基本相同,如果参数小于起点,linstep 将返回0,如果参数大于终点,linstep将返回1。
float fogDistance = length(uCamera-(uMMatrix*vec4(aPosition,1)).xyz);//顶点到摄像机的距离 const float end = 650.0;//雾结束位置 const float start = 350.0;//雾开始位置 vFogFactor= 1.0-smoothstep(start,end,fogDistance);//计算雾因子下面是使用上面求出来的雾因子计算有雾效果的顶点颜色的片元渲染代码
vec4 objectColor=vec4(0.95,0.95,0.95,1.0);//物体颜色 vec4 fogColor = vec4(0.1,0.1,0.80,1.0);//雾的颜色 if(vFogFactor != 0.0){//如果雾因子为0,不必计算光照 objectColor = objectColor*ambient+objectColor*specular+objectColor*diffuse;//计算光照之后物体颜色 gl_FragColor = objectColor*vFogFactor + fogColor*(1.0-vFogFactor);//物体颜色和雾颜色插值计算最终颜色 }else{ gl_FragColor=fogColor; }
效果如下: