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 函数可以检索以下错误代码。
名称 | 含义 |
---|---|
|
sfactor 或 dfactor 不是接受的值。 |
|
在对 glBegin 的调用和对 glEnd 的相应调用之间调用了函数。 |
备注
在 RGB 模式下,可以使用函数绘制像素,该函数将传入 (源) RGBA 值与已在帧缓冲区中的 RGBA 值混合 (目标值) 。 默认情况下,混合处于禁用状态。 将 glEnable 和 glDisable 与 GL_BLEND 参数一起使用,以启用和禁用混合。
启用后, glBlendFunc 定义混合操作。 sfactor 参数指定使用九种方法中的哪一种方法来缩放源颜色分量。 dfactor 参数指定使用八种方法中的哪一种方法来缩放目标颜色分量。 下表介绍了 11 种可能的方法。 每个方法定义四个比例系数,分别用于红色、绿色、蓝色和 alpha。
在表和后续公式中,源和目标颜色组件称为 (R?、 G?、 B?、 A?) 和 (Rd 、 Gd 、 Bd 、 Ad ) 。 据了解,它们的整数值介于零和 (kR 、 kG 、 kR 、 kA ) 之间,其中
kR = 2mR - 1
kG = 2mG - 1
kB = 2mB - 1
kA = 2mA - 1
和 (mR 、 mG 、 mB 、 mA ) 是红色、绿色、蓝色和 alpha 位平面的数目。
源和目标比例因子称为 (R、G 、B、a ) 和 (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 | (R?/ kR 、 G?/ kG 、 B?/ kB 、 A?/ kA ) |
GL_ONE_MINUS_SRC_COLOR | (1,1,1,1) - (R?/ kR 、 G?/ kG 、 B?/ kB 、 A?/ 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 / k B、Ad / kA ) |
GL_SRC_ALPHA | (A?/ kA 、 A?/ kA 、 A?/ kA 、 A?/ kA ) |
GL_ONE_MINUS_SRC_ALPHA | (1,1,1,1) - (A?/ kA 、 A?/ kA 、 A?/ kA 、 A?/ kA ) |
GL_DST_ALPHA | (Ad / kA 、Ad / kA 、Ad / kA 、A d / 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 (A?、kA - d ) / kA
为了确定在 RGBA 模式下绘制时像素的混合 RGBA 值,系统使用以下公式:
R (d) = min ( kR , R? + RddR )
G (d) = min ( kG , G? sG + GddG )
B (d) = min ( kB, B? sB + BddB )
(d) = min ( kA 、 A? sA + 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 [仅限桌面应用] |
标头 |
|
库 |
|
DLL |
|