1、透明效果
使用以下函数可以实现透明效果:
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
它的意思是,先画的物体使用自己的透明度,后画的物体使用1减去先画物体的透明度。
一般的,后画的物体如果有透明的部分,即Alpha值小于1的部分,将可以看到后面的物体。
它和深度测试有时是矛盾的。
一般深度测试需要先画近的物体,再画远的物体,这样远的物体如果被遮挡则不会绘制,提高效率。
如果近的物体包含透明度,则需要后画。
否则透明物体画完后,后面的物体由于深度测试,被挡住部分不会被画,没有了透明效果。
这个时候,如果不改变画的顺序,而是取消深度测试也是不行的。
因为透明物体各个部分透明度不一定相同,如果有不透明的部分,远处的物体又会遮挡近处的物体。
所以,当包含有透明性质的物体时,正确的顺序应该是:
A. 首先以近处先画,远处后画,并且开启深度测试为大前提。
B. 如果当前物体不是透明的,则画出。
C. 如果当前物体包含透明部分,则先不画,等待比它远的物体都画完后,再画出。
重复B和C,直到所有物体都被画完。
也可以理解为:
A. 开启深度缓冲。
B. 由近至远地画出所有不透明的物体。
C. 由远至近地画出所有包含透明部分的物体。
2、雾化效果
使用以下函数开启雾化效果及指定雾化效果使用的颜色:
gl.glEnable(GL10.GL_FOG);
gl.glFogfv(GL10.GL_FOG_COLOR, );
雾化效果有三种模式:
GL_EXP全局雾化效果。
GL_EXP2全局雾化效果增强版。
GL_LINEAR线性雾化效果,效果最好。
使用GL_LINEAR模式时,还可以指定两个参数:
gl.glFogf(GL10.GL_FOG_START, );
gl.glFogf(GL10.GL_FOG_END, );
这两个参数表示雾化开始及达到最大效果的渐变范围。
near表示近面到屏幕的距离,far表示远面到屏幕的距离。
小于near的范围,没有雾化效果;大于far的范围,完全使用雾化设定的颜色绘制物体。
为了用于测试效果,far的设定最好不要大于能够绘制的最远物体的距离。
否则由于渐变范围太大,雾化效果在近距离的物体上体现不出来。
使用GL_EXP或者GL_EXP2模式时,还可以指定一个参数:
gl.glFogf(GL10.GL_FOG_DENSITY, );
这个参数用于指定雾的密度,一般设定为0.3左右。
如果采用投影视图方式的话,可以达到简单的GL_LINEAR的效果。
可以用以下方法其中之一对雾化效果进行修正:
gl.glHint(GL10.GL_FOG_HINT, GL10.GL_DONT_CARE);
gl.glHint(GL10.GL_FOG_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_FOG_HINT, GL10.GL_FASTEST);
|
|