[OpenGL]glEnable的用法
标签:
openglandroid |
分类: 图形图像 |
摘要:主要概述了glEnable(GL_DEPTH_TEST)和glEnable(GL_BLEND)的用法
glEnable(GL_DEPTH_TEST)的用法
opengl es API里面有个glEnable方法,这个方法可以设置的常量很多,而且对于我等新入门的人来说也非常的难理解,网上的资料也是比较少,因此学习难度还是比较大的。下面还是以beginning android games的例子为例。
先讲一下GL_DEPTH_TEST模式,开启这个模式后,opengl 会起用深度测试模式,以下图为例:
http://dl.iteye.com/upload/attachment/0067/3046/f6b90719-2427-38bf-8ca1-06dbbd8c5308.png
上面的每当两个图相加时,总是显示颜色深度较小的那个颜色,这就是深度比较的结果,如果颜色深度一样,则还是显示原来的那个颜色。大体用法也很简单:
-
、、、、
- gl.glEnable(GL10.GL_DEPTH_TEST);
//之所以不是 glEnable(GL_DEPTH_TEST);是因为平台为Android -
-
vertices.bind(); -
vertices.draw(GL10.GL_TRIANGLES, 0, 6); -
vertices.unbind(); -
-
gl.glDisable(GL10.GL_DEPTH_TEST); - 、、、、、
先开启深度测试模式,再画图,最后关闭此模式。例如先画一个红色的三角形,再画一个绿色的三角形,如果两个三角形的颜色深度一样,则会显示:
http://dl.iteye.com/upload/attachment/0067/3058/b0a846ff-5e77-3f8c-a36b-400853d838a4.png
即还是显示原来的红色,如果没有启用深度测试模式,则绿色的三角形应该在前面。
glEnable(GL_BLEND)的用法
下面再讲一个GL_BLEND即融合模式,这个东西的作用就是将重叠的图形融合在一起,用法大体如下:
-
gl.glEnable(GL10.GL_BLEND);
-
gl.glBlendFunc(GL10.GL_SRC_ALPHA,
GL10.GL_ONE_MINUS_SRC_ALPHA); -
-
vertices.bind();
-
vertices.draw(GL10.GL_TRIANGLES,
3, 3);//绿色三角形 -
vertices.draw(GL10.GL_TRIANGLES,
0, 3);//红色三角形 -
vertices.unbind();
-
-
gl.glDisable(GL10.GL_BLEND);
-
gl.glDisable(GL10.GL_DEPTH_TEST);
显示如下:
http://dl.iteye.com/upload/attachment/0067/3060/184f28a2-0f9d-3266-a68e-15c0014b8b98.png
需要注意的是上面的两个三角形颜色深度是不一样的,即红色三角形的颜色深度要浅一些,所以如果是先画红三角形的话,那么绿色三角形被遮挡的部分因为颜色太深就会显示不出来,结果就会像下面这样:
http://dl.iteye.com/upload/attachment/0067/3062/1f20fad5-1f44-3302-99ec-d7d7a07a4059.png
再说一点,颜色深浅是由RGBA中的A决定的,越小优先级越高。
如果设置了glEnable(GL_BLEND)则可以调用glBlendFunc
glBlendFunc();--混合
源因子和目标因子是可以通过glBlendFunc函数来进行设置的。glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。
GL_ZERO: 表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
GL_ONE: 表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。
GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来 作为因子。 除此以外,还有GL_SRC_COLOR(把源颜色的四个分量分别作为因子的四个分量)、GL_ONE_MINUS_SRC_COLOR、 GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前两个在OpenGL旧版本中只能用于设置目标因子,后两个在OpenGL 旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为 因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、 GL_ONE_MINUS_CONST_ALPHA。另外还有GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha 值和RGB值采用不同的混合因子。
举例来说: 如果设置了glBlendFunc(GL_ONE, GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。如果没有设置源因子和 目标因子,则默认情况就是这样的设置。 如果设置了glBlendFunc(GL_ZERO, GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。(但这并不是说这样设置就没有用,有些时候可能有特殊用途) 如 果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha 值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减 小。这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。 如果设置了glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色。
注意: 所 谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则 红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。不要被混乱的顺序搞晕 。

加载中…