glBlendFunc()函数的使用

参考原文链接:http://blog.chinaunix.net/uid-20622737-id-2850251.html

glBlendFunc();–混合

OpenGL会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜色。

(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等)

下面用数学公式来表达一下这个运算方式。

假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs, Gs, Bs, As),

目标颜色的四个分量是(Rd, Gd, Bd, Ad),

又设源因子为(Sr, Sg, Sb, Sa),

目标因子为(Dr, Dg, Db, Da)。

则混合产生的新颜色可以表示为: (RsSr+RdDr, GsSg+GdDg, BsSb+BdDb, AsSa+AdDa) 当然了,如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题。

源因子和目标因子是可以通过glBlendFunc函数来进行设置的。

GL_APICALL void         GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);

glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。

这两个参数可以是多种值,下面介绍比较常用的几种。

/* BlendingFactorDest */
#define GL_ZERO                           0// 表示使用0.0作为因子,完全不使用这种颜色
#define GL_ONE                            1//表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
#define GL_SRC_COLOR                      0x0300//把源颜色的四个分量分别作为因子的四个分量
#define GL_ONE_MINUS_SRC_COLOR            0x0301//把1.0减去源颜色的四个分量分别作为因子的四个分量
#define GL_SRC_ALPHA                      0x0302//表示使用源颜色的alpha值来作为因子
#define GL_ONE_MINUS_SRC_ALPHA            0x0303//表示用1.0减去源颜色的alpha值来作为因子
#define GL_DST_ALPHA                      0x0304//表示使用目标颜色的alpha值来作为因子。
#define GL_ONE_MINUS_DST_ALPHA            0x0305//表示用1.0减去目标颜色的alpha值来作为因子

举例来说: 如果设置了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),结果为黄色。

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

//如何去使用
//1使用前先开启混合功能
glEnable(GL_BLEND);

//2然后直接调用这个函数
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

//OK了,这就结束,开始混合了
//注意不要弄混了源颜色和目标颜色
  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释一下 GLES20.glClearColor(0.0f, 0.0f, 0.0f, Vuforia.requiresAlpha() ? 0.0f : 1.0f); for (Texture t : mTextures) { GLES20.glGenTextures(1, t.mTextureID, 0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, t.mTextureID[0]); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, t.mWidth, t.mHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, t.mData); } shaderProgramID = SampleUtils.createProgramFromShaderSrc( CubeShaders.CUBE_MESH_VERTEX_SHADER, CubeShaders.CUBE_MESH_FRAGMENT_SHADER); vertexHandle = GLES20.glGetAttribLocation(shaderProgramID, "vertexPosition"); // textureCoordHandle = GLES20.glGetAttribLocation(shaderProgramID, // "vertexTexCoord"); mVColorCenterHandler = GLES20.glGetUniformLocation(shaderProgramID, "vColorCenter"); mvpMatrixHandle = GLES20.glGetUniformLocation(shaderProgramID, "modelViewProjectionMatrix"); texSampler2DHandle = GLES20.glGetUniformLocation(shaderProgramID, "texSampler2D"); if(!mModelIsLoaded) { mTeapot = new Teapot(); mxyz1 = new xyz1(); try { mBuildingsModel = new SampleApplication3DModel(); mBuildingsModel.loadModel(mActivityRef.get().getResources().getAssets(), "ImageTargets/Buildings.txt"); mModelIsLoaded = true; } catch (IOException e) { Log.e(LOGTAG, "Unable to load buildings"); } // Hide the Loading Dialog mActivityRef.get().loadingDialogHandler .sendEmptyMessage(LoadingDialogHandler.HIDE_LOADING_DIALOG); } }
最新发布
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值