OpenGL ES雾


其实一般来讲,在OpenGL中所实现的雾效果和现实中的雾是有区别的。现实中的雾是充斥在空间中的,而OpenGL中的雾是附着在物体表面的,通过混合每个片元的颜色和一个常量的雾颜色来实现的,雾的密度量由顶点到相机的距离确定,离观察者近雾浓度小,而越远浓度越大。我们可以用线性关系或者非线性关系来来表达在顶点到相机之间的雾量。

首先来看两个函数:
smoothstep(float start, float end, float parameter)
linstep(float start, float end, float parameter)
此两个函数使用方法基本相同,如果参数小于起点,linstep 将返回0,如果参数大于终点,linstep将返回1。
smoothstep是非线性关系,linstep是线性关系,他俩的变化关系如下图。


下面是一个使用非线性关系实现的获取雾因子的顶点渲染代码:
   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;
 	}

效果如下:

OpenGL ES雾_第1张图片





你可能感兴趣的:(3D,OpenGL,es,雾,smoothstep,linstep)