雾效果:使所绘制物体距离观察者越远越看的不清晰。
步骤:首先启用雾,然后设置雾颜色,再指定从多远开始到多远结束,最后指定使用哪种雾方程式。
步骤:首先启用雾,然后设置雾颜色,再指定从多远开始到多远结束,最后指定使用哪种雾方程式。
注:指定雾开始结束只针对线性雾的方程式有效。
雾方程式有三种,变化趋势如下:
计算方法如下:
从方程式更能说明雾开始结束只针对线性雾的方程式有效。
首先在onSurfaceChanged方法中修改平截头体深度,以便直观观察:
public void onSurfaceChanged(GL10 gl, int width, int height) { //设置视口 gl.glViewport(0,0,width,height); //计算视口比例 ratio = (float)width / (float)height; //设置矩阵模式 gl.glMatrixMode(GL10.GL_PROJECTION); //加载单位矩阵 gl.glLoadIdentity(); //设置平截头体 gl.glFrustumf(ratio,-ratio,-1f,1f,3f,200f);//为方便观察,所以将平截头体深度加大。 }之后对雾效果进行测试:
@Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glColor4f(1, 0, 0, 1); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0); gl.glRotatef(xRotate, 1, 0, 0); gl.glRotatef(yRotate, 0, 1, 0); /*************************启用雾效果*************************/ gl.glEnable(GL10.GL_FOG); //启用雾 gl.glFogfv(GL10.GL_FOG_COLOR,BufferUtils.arr2FloatBuffer( new float[]{0.2f,0.2f,0.2f,1} ));//设置雾颜色 // gl.glFogf(GL10.GL_FOG_START,3);//雾开始距离 // gl.glFogf(GL10.GL_FOG_END,50);//雾结束距离 // gl.glFogf(GL10.GL_FOG_MODE,GL10.GL_LINEAR);//线性方程式 gl.glFogf(GL10.GL_FOG_MODE,GL10.GL_EXP2);//雾方程式 gl.glFogf(GL10.GL_FOG_DENSITY,0.2f);//雾的浓密程度,默认值:1 /************************绘制十个球体************************/ float r = 0.4f; //球体半径 gl.glColor4f(0,0,1,1); gl.glTranslatef(-ratio + r,0,0); //先将坐标轴移至距离左边r的距离 for( int i = 0;i<10;i++ ){ BufferUtils.drawSphere(gl,0.5f,10,10); gl.glTranslatef(0.4f,0,0);//每画一个球先向右移动0.4 gl.glTranslatef(0,0,-3f);//再向里移动3 } }应用了雾效果前后对比图: