雾特效实现非常简单,加入雾化因子的计算;然后,把片元颜色和雾化因子加权就可以了。
雾化因子计算方法如下:
我实现的效果如下:雾的颜色偏黄色。
大部分代码为上一节的内容,这里就不再做介绍了。只介绍雾的部分了
在上一节的shader中加入uCamera参数,用于计算雾因子
#version 330
uniform mat4 uPMatrix,uVMatrix,uMMatrix;
uniform vec3 uCamera;
layout (location = 0) in vec3 aPosition;
layout (location = 1) in vec2 aTexture;
smooth out vec2 vTextureCood;
smooth out float vFogFactor;
float computeFogFactor(){
float tmpFactor;
float fogDistance = length(uCamera-(uMMatrix*vec4(aPosition,1)).xyz);//顶点到摄像机的距离
const float end = 5;//雾结束位置
const float start = 30;//雾开始位置
// tmpFactor = max(min((end- fogDistance)/(end-start),1.0),0.0);//用雾公式计算雾因子,线型
tmpFactor = 1.0 - smoothstep(start,end,fogDistance);//用雾公式计算雾因子,非线型
return tmpFactor;
}
void main(void)
{
gl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition,1);
vTextureCood = aTexture;
vFogFactor = computeFogFactor();
}
在片元着色器中用雾因子做颜色加权
#version 330
uniform sampler2D sTexture;
in vec2 vTextureCood;
in float vFogFactor;
out vec4 fragColor;
void main(void)
{
vec4 objColor = texture2D(sTexture,vTextureCood);
vec4 fogColor = vec4(0.97,0.76,0.03,1.0);//雾的颜色
if(vFogFactor != 0.0){
fragColor = objColor*vFogFactor + fogColor*(1.0-vFogFactor);
}else{
fragColor=fogColor;
}
}
上一节的渲染器需要传入摄像机位置了,做适当添加;这个就不放代码了,加上就可以。
工程至此下载https://download.csdn.net/download/wanghualin033/10871372