Android OpenGL | ES 实现雾气效果

在Android上使用OpenGL ES开发时,模仿自然界的各种现象是很常见的,比如光照、雾气、飘动等效果,今天我们就来使用OpenGL ES实现自然界的雾气效果,雾气效果很简单,我们今天就使用系统自带的三种雾气渲染算法来实现不同的效果,当然你可以自己设置雾气的颜色和范围程度等。

本节的代码是基于Android OpenGL | ES给立方体进行纹理映射一文的代码上修改的,我会重点提到雾气渲染这一块,当然在文章最后你也可以下载到完整的源码。效果图:

我们在继承Renderer类的GLRenderer的基础上加上一些雾气使用的成员变量:

Java代码
  1. //雾气模式
  2. privateintfogMode[]={GL10.GL_EXP,GL10.GL_EXP2,GL10.GL_LINEAR};
  3. //雾气的颜色
  4. privatefloatfogColor[]={0.5f,0.5f,0.5f,1.0f};

变量fogMode用来保存三种类型的雾:GL_EXP,GL_EXP2和GL_LINEAR,这就是我开头提到的三种系统对雾气效果的渲染方式,我将在稍后解释这三种类型的区别。变量fogColor保存雾的颜色。

接着我们就需要在onSurfaceCreated方法中加上一些启用雾气、雾气模式等代码,实现雾气效果的代码很少也很简单,我们一条条的添加上去:

Java代码
  1. //设置清除屏幕时所用的颜色,参数依次为红、绿、蓝、Alpha值
  2. //设置背景的颜色为雾气的颜色
  3. gl.glClearColor(0.5f,0.5f,0.5f,1.0f);
为了获得更好的效果,glClearColor()这个方法已经使用了将屏幕清为同雾相同的颜色的颜色值。
Java代码
  1. //设置雾气的模式
  2. gl.glFogx(GL10.GL_FOG_MODE,fogMode[2]);
这行代码,我们看到使用了前面我们声明和定义的雾气渲染模式的变量。之前我们声明了数组fogMode,它保存了值GL_EXP, GL_EXP2, and GL_LINEAR。现在是使用他们的时候了。我来解释它们:
GL_EXP - 充满整个屏幕的基本渲染的雾。它能在较老的PC上工作,因此并不是特别像雾。
GL_EXP2 - 比GL_EXP更进一步。它也是充满整个屏幕,但它使屏幕看起来更有深度。
GL_LINEAR - 最好的渲染模式。物体淡入淡出的效果更自然。
Java代码
  1. //设置雾气的颜色
  2. gl.glFogfv(GL10.GL_FOG_COLOR,fogColor,0);
设置雾的颜色。之前我们已将变量fogcolor设为(0.5f,0.5f,0.5f,1.0f),这是一个很棒的灰色。
Java代码
  1. //设置雾气的密度
  2. gl.glFogf(GL10.GL_FOG_DENSITY,0.35f);
  3. //设置雾气的系统透视方案
  4. gl.glHint(GL10.GL_FOG_HINT,GL10.GL_DONT_CARE);
GL_FOG_DENSITY表明这是在设置雾的密度。增加数字会让雾更密,减少它则雾更稀。 glHint (GL_FOG_HINT, GL_DONT_CARE); 设置修正。GL_DONT_CARE表示我不关心它的值。另外还有下面的几个参数:
gl_nicest - 对每个像素执行雾效计算(效果好)
gl_fastest - 对每个顶点执行雾效计算 (更快,但效果不如上面的好)
Java代码
  1. //雾气开始地方
  2. gl.glFogf(GL10.GL_FOG_START,1.0f);
  3. //雾气结束地方
  4. gl.glFogf(GL10.GL_FOG_END,5.0f);
glFogf(GL_FOG_START, 1.0f);设定雾效距屏幕多近开始。你可以根据你的需要随意改变这个值。下一行类似,glFogf(GL_FOG_END, 5.0f);告诉OpenGL程序雾效持续到距屏幕多远。
Java代码
  1. //开启雾气
  2. gl.glEnable(GL10.GL_FOG);

这一行应该很熟悉吧,就是告诉系统开启雾气特效。这一段的完整代码如下:

Java代码
  1. //当窗口被创建时我们可以做些初始化工作
  2. @Override
  3. publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
  4. //TODOAuto-generatedmethodstub
  5. //设置清除屏幕时所用的颜色,参数依次为红、绿、蓝、Alpha值
  6. //设置背景的颜色为雾气的颜色
  7. gl.glClearColor(0.5f,0.5f,0.5f,1.0f);
  8. //设置雾气的模式
  9. gl.glFogx(GL10.GL_FOG_MODE,fogMode[2]);
  10. //设置雾气的颜色
  11. gl.glFogfv(GL10.GL_FOG_COLOR,fogColor,0);
  12. //设置雾气的密度
  13. gl.glFogf(GL10.GL_FOG_DENSITY,0.35f);
  14. //设置雾气的系统透视方案
  15. gl.glHint(GL10.GL_FOG_HINT,GL10.GL_DONT_CARE);
  16. //雾气开始地方
  17. gl.glFogf(GL10.GL_FOG_START,1.0f);
  18. //雾气结束地方
  19. gl.glFogf(GL10.GL_FOG_END,5.0f);
  20. //开启雾气
  21. gl.glEnable(GL10.GL_FOG);
  22. ......
  23. }

猜你喜欢

转载自huiytt.iteye.com/blog/1829758