openGL之混合、抗锯齿---openGL学习笔记(十一)

在openGL中,深度测试可以很好的用一个深度值为我们计量物体到观察者眼球的距离,从而决定该物体是否显示。

不过在显示生活中,我们也经常遇到如下情况:

透过一块有色的玻璃,所观察到的物体与物体实际颜色并不相符,而有的时候我们就是想要达到这种透过玻璃看物体的效果,那么,就需要启用混合。

用混合可以将不同透明度的物体混合起来显示,但需要注意的是

1.混合一旦开启,深度测试马上失效。

2.启动混合时,要先绘制不透明的物体(透明度低),再绘制透明的物体(透明度高)

在openGL中混合的计算是运用混合方程式实现的:

Cf = Cs * S + Cd * D(S:源颜色的混合因数 D:目标颜色的混合因数 )

所以最终的颜色是由,源颜色乘以源颜色的混合因数加上目标颜色乘以目标颜色的混合因数构成。

(源颜色:即将进入颜色缓冲区的颜色值。
目标颜色:已经存储在颜色缓冲区中的颜色值)

下面通过绘制两个叠加的正方形来观察效果:

首先初始化工作:清除颜色缓冲区--设置绘图颜色--设置矩阵类型为投影矩阵--载入单位矩阵--放置眼球位置--设置旋转角度。

//清除颜色缓冲区
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
//设置绘图颜色
gl.glColor4f(1f, 1f, 1f, 1f);
//设置模型视图矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
//载入单位矩阵
gl.glLoadIdentity();
//放置眼球位置
GLU.gluLookAt(gl, 0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f);
//旋转角度,以便更直观查看
gl.glRotatef(xRotate,1, 0, 0);// x轴旋转 (openGL规定,顺时针旋转为负值)
gl.glRotatef(yRotate,0,1,0);// y轴旋转
然后在设置坐标以及绘制正方形之前要先启用混合和设置混合因子:

gl.glEnable(GL10.GL_BLEND);//启用混合
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);//设置混合因子
最后就可以设置坐标以及绘制正方形了,需要注意的是,设置绘图颜色的第四个参数为透明度,这里的两个透明度尽量相差大一些,否则效果不明显。

这里是采用画三角形带的方式绘制,效果图:

openGL之混合、抗锯齿---openGL学习笔记(十一)_第1张图片

接下来,我们来看抗锯齿效果,在openGL中绘制的点、线、多边形在一定的倾斜角度下就会出现锯齿,有的时候我们并不想要这种想过,那么就要用到openGL中的抗锯齿。

抗锯齿是依赖于混合的,所以应用抗锯齿要先启用混合,然后设置混合因子,
再启用点平滑线平滑或者多边形平滑,在启用平滑之后还可以指定平滑暗示:速度优先或者质量优先。

/**************************** 抗锯齿 *********************************/
gl.glEnable(GL10.GL_BLEND);//开启混合
gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA);//设置混合因子
gl.glEnable(GL10.GL_POINT_SMOOTH);//开启点平滑
gl.glEnable(GL10.GL_NICEST);//设置质量优先
如下是抗锯齿前后的效果图:(以绘制螺旋线为例)

openGL之混合、抗锯齿---openGL学习笔记(十一)_第2张图片openGL之混合、抗锯齿---openGL学习笔记(十一)_第3张图片

你可能感兴趣的:(openGL)