glBlendFunc 函数

glBlendFunc 函数指定像素算术。

语法

void WINAPI glBlendFunc(
   GLenum sfactor,
   GLenum dfactor
);

参数

sfactor

指定如何计算红色、绿色、蓝色和 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和GL_SRC_ALPHA_SATURATE。

dfactor

指定如何计算红色、绿色、蓝色和 alpha 目标混合因子。 接受八个符号常量:GL_ZERO、GL_ONE、GL_SRC_COLOR、GL_ONE_MINUS_SRC_COLOR、GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA、GL_DST_ALPHA和GL_ONE_MINUS_DST_ALPHA。

返回值

此函数不返回值。

错误代码

glGetError 函数可以检索以下错误代码。

名称 含义
GL_INVALID_ENUM
sfactordfactor 不是接受的值。
GL_INVALID_OPERATION
在对 glBegin 的调用和对 glEnd 的相应调用之间调用了函数。

备注

在 RGB 模式下,可以使用函数绘制像素,该函数将传入 (源) RGBA 值与已在帧缓冲区中的 RGBA 值混合 (目标值) 。 默认情况下,混合处于禁用状态。 将 glEnableglDisable 与 GL_BLEND 参数一起使用,以启用和禁用混合。

启用后, glBlendFunc 定义混合操作。 sfactor 参数指定使用九种方法中的哪一种方法来缩放源颜色分量。 dfactor 参数指定使用八种方法中的哪一种方法来缩放目标颜色分量。 下表介绍了 11 种可能的方法。 每个方法定义四个比例系数,分别用于红色、绿色、蓝色和 alpha。

在表和后续公式中,源和目标颜色组件称为 (R?、 G?、 B?、 A?) 和 (RdGdBdAd ) 。 据了解,它们的整数值介于零和 (kRkGkRkA ) 之间,其中

kR = 2mR - 1

kG = 2mG - 1

kB = 2mB - 1

kA = 2mA - 1

和 (mRmGmBmA ) 是红色、绿色、蓝色和 alpha 位平面的数目。

源和目标比例因子称为 (RGBa ) 和 (dRdGdBdA ) 。 表中描述的比例因子表示 (fRfGfBfA ) 表示源因子或目标因子。 所有比例系数的范围为 [0,1]。

参数 (fRfGfBfA )
GL_ZERO (0,0,0,0)
GL_ONE (1,1,1,1)
GL_SRC_COLOR (R?/ kRG?/ kGB?/ kBA?/ kA )
GL_ONE_MINUS_SRC_COLOR (1,1,1,1) - (R?/ kRG?/ kGB?/ kBA?/ kA )
GL_DST_COLOR (Rd / kRGd / kGBd / kBAd / kA )
GL_ONE_MINUS_DST_COLOR (1,1,1,1) - (Rd / kRGd / kGBd / k BAd / kA )
GL_SRC_ALPHA (A?/ kAA?/ kAA?/ kAA?/ kA )
GL_ONE_MINUS_SRC_ALPHA (1,1,1,1) - (A?/ kAA?/ kAA?/ kAA?/ kA )
GL_DST_ALPHA (Ad / kAAd / kAAd / kAA d / kA )
GL_ONE_MINUS_DST_ALPHA (1,1,1,1) - (Ad / kAAd / kAAd / kAAd / kA )
GL_SRC_ALPHA_SATURATE (i,i,i, 1)

在表中,

i = min (A?、kA - d ) / kA

为了确定在 RGBA 模式下绘制时像素的混合 RGBA 值,系统使用以下公式:

R (d) = min ( kRR + RddR )

G (d) = min ( kGGsG + GddG )

B (d) = min ( kB, BsB + BddB )

(d) = min ( kAAsA + AddA )

尽管上述公式具有明显的精度,但混合算术并没有完全指定,因为混合运算使用不精确的整数颜色值。 但是,应等于 1 的混合因子保证不会修改其乘法,而等于零的混合因子会将其乘数减为零。 因此,例如,当 sfactor 为GL_SRC_ALPHA时, dfactor 为 GL_ONE_MINUS_SRC_ALPHA,而 A?等于 kA,公式缩减为简单替换:

Rd = R

Gd = G

Bd = B

Ad = A

示例

透明度最好使用 glBlendFunc (GL_SRC_ALPHA来实现,GL_ONE_MINUS_SRC_ALPHA) 基元从最远到最接近排序。 请注意,此透明度计算不需要帧缓冲区中存在 alpha 位平面。

还可以使用 glBlendFunc (GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) 任意顺序呈现抗锯齿点和线条。

若要优化多边形抗锯齿,请使用 glBlendFunc (GL_SRC_ALPHA_SATURATE,GL_ONE) 多边形从最近到最远排序。 (有关 polygon antialiasing.) Destination alpha 位平面的信息,请参阅 glEnable 中的GL_POLYGON_SMOOTH参数,该参数必须存在才能使此混合函数正常运行,并存储累积的覆盖范围。

传入 (源) alpha 是一种材料不透明度,范围从 1.0 (KA ) (表示完全不透明度)到 0.0 (0) ,表示完全透明度。

为绘图启用多个颜色缓冲区时,每个已启用的缓冲区将单独混合,并且缓冲区的内容将用于目标颜色。 (请参阅 glDrawBuffer.)

混合仅影响 RGBA 呈现。 颜色索引呈现器会忽略它。

以下函数检索与 glBlendFunc 相关的信息:

带参数GL_BLEND_SRC的 glGet

带参数GL_BLEND_DST的 glGet

glIsEnabled with argument GL_BLEND

要求

要求
最低受支持的客户端
Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器
Windows 2000 Server [仅限桌面应用]
标头
Gl.h

Opengl32.lib
DLL
Opengl32.dll

另请参阅

glAlphaFunc

glBegin

glClear

glDisable

glDrawBuffer

glEnable

glGet

glIsEnabled

glLogicOp

glStencilFunc