glBlendFunc
public void glBlendFunc(int sfactor,int dfactor)
功能:
指明像素算法。
详细:
像素可以通过函数操作后被绘出,该函数的功能是将引入的值与颜色缓冲中已有的值混合。使用glEnable方法与glDisable方法以GL_BLEND为参数,决定是否开启混合功能,该功能初始为关闭的。
当混合功能开启时glBlendFunc定义混合功能的操作。sfactor指明十一中方法中的哪一种用来衡量源颜色要素,dfactor指明十种方法中的哪一种用来衡量目的颜色要素。十一种可能的方法将在下面进行介绍。每一种方法定义了四个衡量元素,分别是红、绿、蓝和 alpha。
在后面的内容中,源与目的颜色要素被指为(Rs, Gs, Bs, As)和(Rd, Gd, Bd, Ad),它们的值为0至(kR, kG, kB, kA)之间的整数,其中kc = 2mc – 1,并且(mR, mG, mB, mA)是红、绿、蓝和alpha位平面的数量。
源和目标比例系数由(sR, sG, sB, sA)和(dR, dG, dB, dA)指定。比例系数用(fR, fG, fB, fA)表示,代表既不是源也不是目标因素,所有比例系数属于区间[0, 1]。
参数 (fR, fG, fB, fA)
GL_ZERO (0, 0, 0, 0)
GL_ONE (1, 1, 1, 1)
GL_SRC_COLOR (Rs/kR, Gs/kG, Bs/kB, As/kA )
GL_ONE_MINUS_SRC_COLOR (1, 1, 1, 1) - (Rs/kR, Gs/kG, Bs/kB, As/kA)
GL_DST_COLOR (Rd/kR, Gd/kG, Bd/kB, Ad/kA )
GL_ONE_MINUS_DST_COLOR (1, 1, 1, 1) - (Rd/kR, Gd/kG, Bd/kB, Ad/kA)
GL_SRC_ALPHA (As/kA, As/kA, As/kA, As/kA )
GL_ONE_MINUS_SRC_ALPHA (1, 1, 1, 1) -(As/kA, As/kA, As/kA, As/kA)
GL_DST_ALPHA (Ad/kA, Ad/kA, Ad/kA, Ad/kA )
GL_ONE_MINUS_DST_ALPHA (1, 1, 1, 1) -(Ad/kA, Ad/kA, Ad/kA, Ad/kA)
GL_SRC_ALPHA_SATURATE (i, i, i, 1) i = min(As, kA - Ad) / kA
为了确定像素的混合值,系统利用下列等式。
Rd = min( kR, Rs sR + Rd dR )
Gd = min( kG, Gs sG + Gd dG )
Bd = min( kB, Bs sB + Bd dB )
Ad = min( kA, As sA + Ad dA )
尽管从表面上看混合算法并没有指明上述等式的精度,因为混合操作是采用不精确的整型颜色值。然而应当等于1的混合因素要被确保没有修改它的被乘数,并且一个等于0的混合因素要降低它的被乘数至0。举一个例子,当sfactor是GL_SRC_ALPHA,dfactor 是GL_ONE_MINUS_SRC_ALPHA并且As等于kA时,等式进行简单替换。
Rd = Rs
Gd = Gs
Bd = Bs
Ad = As
对于所有像素元素的写入操作进行glBlendFunc操作时,包括对于点、线、多边形的扫描转换,都不影响glClear方法。
举例:
为了渲染物体从远到近排列的效果,最好应用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)处理透明度。请注意这个透明度计算不要求存在颜色缓冲区中的alpha位面数。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)对于渲染抗锯齿的点和线也很有效。
注意:
引入的(源)alpha被认为是不透明的,范围是1.0 (kA),表明完全不透明,而0表明完全透明。
错误:
当sfactor或dfactor为不允许的值时,产生GL_INVALID_ENUM(错误枚举)。
参数:
sfactor——指明源图元的红、绿、蓝、alpha的混合比例是怎样计算的。允许的符号符号常量有:GL_ZERO, GL_ONE,GL_SRC_COLOR (仅1.1), GL_ONE_MINUS_SRC_COLOR (仅1.1), GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, 和 GL_SRC_ALPHA_SATURATE,初始值是GL_ONE。
dfactor——指明目图元的红、绿、蓝、alpha的混合比例是怎样计算的。允许的符号符号常量有:GL_ZERO, GL_ONE,GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR (仅1.1),GL_ONE_MINUS_DST_COLOR (仅1.1), GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, 和 GL_ONE_MINUS_DST_ALPHA,初始值为GL_ZERO
网络解释:
第一个参数指出源图元的alpha的取值计算方法,第二个参数指出目标处的alpha的计算方法。
两个参数的取值都可以是如下常量之一:
GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, and GL_SRC_ALPHA_SATURATE
比如GL_ZERO表示alpha取值为0,GL_ONE表示1,GL_DST_COLOR表示取目标区域的颜色值,GL_SRC_ALPHA表示取源区域的alpha值等等。例如:
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
表示把渲染的图像叠加到目标区域,也就是说源的每一个像素的alpha都等于自己的alpha,目标的每一个像素的alpha等于1。这样叠加次数越多,叠加的图元的alpha越高,得到的结果就越亮。因此这种融合用于表达光亮效果。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
表示把渲染的图像融合到目标区域。也就是说源的每一个像素的alpha都等于自己的alpha,目标的每一个像素的alpha等于1减去该位置源像素的alpha。 因此不论叠加多少次,亮度是不变的。