Android OpenGLES2.0(十八)——轻松搞定Blend颜色混合
Posted 湖广午王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android OpenGLES2.0(十八)——轻松搞定Blend颜色混合相关的知识,希望对你有一定的参考价值。
Blend是OpenGL中的一个非常重要的部分,它可以让每个输出的源和目的颜色以多种方式组合在一起,以呈现出不同的效果,满足不同的需求。
Blend相关函数及意义
在OpenGLES1.0中,Blend在OpenGLES固定的管线中,OpenGLES2.0相对1.0来说,更为灵活。在OpenGLES2.0中,与Blend相关的函数及功能主要有:
//调用此方法,传入GL_BLEND开启BLEND功能
void glEnable(GLenum cap);
//调用此方法,出入GL_BLEND关闭BLEND功能
void glDisable(GLenum cap);
//设置BLEND颜色,结合glBlendFuncSeparate或glBlendFunc使用
void glBlendColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);
//设置BLEND方程式
void glBlendEquation(GLenum mode);
//对RGB和Alpha分别设置BLEND方程式
void glBlendEquationSeparate(GLenum modeRGB,GLenum modeAlpha);
//设置BLEND函数
void glBlendFunc(GLenum sfactor,GLenum dfactor);
//对RGB和Alpha分别设置BLEND函数
void glBlendFuncSeparate(GLenum srcRGB,GLenum dstRGB,GLenum srcAlpha,GLenum dstAlpha);
Blend的使用比较简单,但是如果不理解Blend的这些函数及参数的意义,使用了错误的参数,就难以获得我们所期望的混合结果了。
想要使用Blend,glEnable(GL_BLEND)
当然是必须的。与之对应的,不需要Blend的时候,我们需要调用glDisable(GL_BLEND)
来关闭混合。
另外的四个方法,看名字差不多就能知道他们的意义了。
glBlendFunc
和glBlendFuncSeparate
都是设置混合因子,反正就是这么个意思了。区别在于glBlendFunc是设置RGBA的混合因子,而glBlendFuncSeparate是分别设置RGB和Alpha的混合因子。设置混合因子是做什么的呢?继续看。
glBlendEquation
和glBlendEquationSeparate
都是设置Blend的方程式,也就是设置混合的计算方式了,具体参数后面说。他们的区别在同glBlendFunc
和glBlendFuncSeparate
的区别一样。
颜色、因子、方程式,组合起来就是:最终颜色=(目标颜色*目标因子)@(源颜色*源因子),其中@表示一种运算符。
至于glBlendColor则是在glBlendFunc和glBlendFuncSeparate的设置中,因子可以设置和常量相关的,这个常量就是由glBlendColor设置进去的。
glBlendFunc及glBlendFuncSeparate详细说明
glBlendFuncSeparate设置混合因子,参数及它们表示的主要如下,而glBlendFunc的参数也是这些,表示的意义就是RGB和A合并为RGBA就是了。在下表中,s0表示源,d表示目的,c表示有glBlendColor设置进来的常量。
Parameter | RGB Factor | Alpha Factor |
---|---|---|
GL_ZERO | (0, 0, 0) | 0 |
GL_ONE | (1, 1, 1) | 1 |
GL_SRC_COLOR | (Rs0, Gs0, Bs0) | As0 |
GL_ONE_MINUS_SRC_COLOR | (1, 1, 1) - (Rs0, Gs0, Bs0) | 1 - As0 |
GL_DST_COLOR | (Rd, Gd, Bd) | Ad |
GL_ONE_MINUS_DST_COLOR | (1, 1, 1) - (Rd, Gd, Bd) | 1 - Ad |
GL_SRC_ALPHA | (As0, As0, As0) | As0 |
GL_ONE_MINUS_SRC_ALPHA | (1, 1, 1) - (As0, As0, As0) | 1 - As0 |
GL_DST_ALPHA | (Ad, Ad, Ad) | Ad |
GL_ONE_MINUS_DST_ALPHA | (1, 1, 1) - (Ad, Ad, Ad) | Ad |
GL_CONSTANT_COLOR | (Rc, Gc, Bc) | Ac |
GL_ONE_MINUS_CONSTANT_COLOR | (1, 1, 1) - (Rc, Gc, Bc) | 1 - Ac |
GL_CONSTANT_ALPHA | (Ac, Ac, Ac) | Ac |
GL_ONE_MINUS_CONSTANT_ALPHA | (1, 1, 1) - (Ac, Ac, Ac) | 1 - Ac |
GL_SRC_ALPHA_SATURATE | (i, i, i) | 1 |
glBlendEquation及glBlendEquationSeparate详细说明
glBlendEquationSeparate的设置混合操作,参数及其意义如下表所示。通过glBlendEquationSeparate或者glBlendEquation设置的方程中,源和目的颜色分别为 (Rs,Gs,Bs,As) 和 (Rd,Gd,Bd,Ad) 。最终混合的颜色结果为 (Rr,Gr,Br,Ar) 。源和目的的混合因子分别为 (sR,sG,sB,sA) 和 (dR,dG,dB,dA) 。其中,所有的颜色分量的取值范围都为[ 0, 1 ]。GL_MIN和GL_MAX是在OpenGLES3.0才有的。
Mode | RGB Components | Alpha Component |
---|---|---|
GL_FUNC_ADD | RrGrBr=sRRs+dRRd=sGGs+dGGd=sBBs+dBBd | Ar=sAAs+dAAd |
GL_FUNC_SUBTRACT | RrGrBr=sRRs−dRRd=sGGs−dGGd=sBBs−dBBd |
Ar=sAAs−dAndroid OpenGLES2.0——了解OpenGLES2.0
OpenglES2.0 for Android:来画个立方体吧 OpenglES2.0 for Android:各种变换来一波 |