加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[OpenGL]glEnable的用法

(2014-10-14 11:31:46)
标签:

opengl

android

分类: 图形图像
转载:http://fansofjava.iteye.com/blog/1503252

摘要:主要概述了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
上面的每当两个图相加时,总是显示颜色深度较小的那个颜色,这就是深度比较的结果,如果颜色深度一样,则还是显示原来的那个颜色。大体用法也很简单:
  1. 、、、、  
  2. gl.glEnable(GL10.GL_DEPTH_TEST);  //之所以不是glEnable(GL_DEPTH_TEST);是因为平台为Android
  3.               
  4.  vertices.bind();  
  5.  vertices.draw(GL10.GL_TRIANGLES, 06);  
  6.  vertices.unbind();  
  7.               
  8.  gl.glDisable(GL10.GL_DEPTH_TEST);  
  9. 、、、、、  

先开启深度测试模式,再画图,最后关闭此模式。例如先画一个红色的三角形,再画一个绿色的三角形,如果两个三角形的颜色深度一样,则会显示:

http://dl.iteye.com/upload/attachment/0067/3058/b0a846ff-5e77-3f8c-a36b-400853d838a4.png
即还是显示原来的红色,如果没有启用深度测试模式,则绿色的三角形应该在前面。

glEnable(GL_BLEND)的用法


下面再讲一个GL_BLEND即融合模式,这个东西的作用就是将重叠的图形融合在一起,用法大体如下:
  1. gl.glEnable(GL10.GL_BLEND);  
  2. gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);  
  3.               
  4. vertices.bind();  
  5. vertices.draw(GL10.GL_TRIANGLES, 33);//绿色三角形  
  6. vertices.draw(GL10.GL_TRIANGLES, 03);//红色三角形  
  7. vertices.unbind();  
  8.               
  9. gl.glDisable(GL10.GL_BLEND);             
  10. 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();--混合

         OpenGL 会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜 色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨 论这个了) 下面用数学公式来表达一下这个运算方式。假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(Sr, Sg, Sb, Sa),目标因子为(Dr, Dg, Db, Da)。则混合产生的新颜色可以表示为: (Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da) 当然了,如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题。

源因子和目标因子是可以通过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),结果为黄色。

 

注意: 所 谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则 红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。不要被混乱的顺序搞晕 。



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有