opengl 纹理混合 glBlendFunc

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。 因此不论叠加多少次,亮度是不变的。

你可能感兴趣的:(opengl)