OpenGL函数思考-glBlendFunc

OpenGL函数思考-glBlendFunc

函数原型:

     void glBlendFunc(GLenum sfactor,GLenum dfactor)
参数说明:

  •       sfactor:源颜色系融合方法,可取如下值GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, and GL_SRC_ALPHA_SATURATE
  •       dfactor:目标颜色融合方法,可取如下值GL_ZERO, GL_ONE, GL_SCR_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR, GL_DST_ALPHA, and GL_ONE_MINUS_DST_ALPHA

函数说明:

      在RGB模式下,可以使用把引入的RGBA值(源)与帧缓存中的RGBA值(目标)相融合的融合函数来绘制像素。缺省时,融合是关闭的,可以使用glEnable(GL_BLEND)来激活融合。

      当激活融合时,可以使用glBlendFunc函数定义融合操作。

      OpenGL 会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜 色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨 论这个了)
      下面用数学公式来表达一下这个运算方式。假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(Sr, Sg, Sb, Sa),目标因子为(Dr, Dg, Db, Da)。则混合产生的新颜色可以表示为:
(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da)
      当然了,如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题。

      源因子和目标因子是可以通过glBlendFunc函数来进行设置的。glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。
GL_ZERO:     表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
GL_ONE:      表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。
GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。
除 此以外,还有GL_SRC_COLOR(把源颜色的四个分量分别作为因子的四个分量)、GL_ONE_MINUS_SRC_COLOR、 GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前两个在OpenGL旧版本中只能用于设置目标因子,后两个在OpenGL 旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为 因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、 GL_ONE_MINUS_CONST_ALPHA。另外还有GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha 值和RGB值采用不同的混合因子。

举例来说:
      如果设置了glBlendFunc(GL_ONE, GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。如果没有设置源因子和目标因子,则默认情况就是这样的设置。
      如果设置了glBlendFunc(GL_ZERO, GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。(但这并不是说这样设置就没有用,有些时候可能有特殊用途)
      如果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha 值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减 小。这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。
      如果设置了glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色。
注意:
      所谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则 红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。不要被混乱的顺序搞晕 了。

时间: 2024-07-31 11:26:56

OpenGL函数思考-glBlendFunc的相关文章

OpenGL函数思考-glMatrixMode

OpenGL函数思考-glMatrixMode  函数原型:        void glMatrixMode(GLenum mode) 参数说明:        mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: GL_MODELVIEW,对模型视图矩阵堆栈应用随后的矩阵操作.可以在执行此命令后,输出自己的物体图形了. GL_PROJECTION,对投影矩阵堆栈应用随后的矩阵操作.可以在执行此命令后,为我们的场景增加透视. GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.可以

OpenGL函数思考-glColor

OpenGL函数思考-glColor 函数原型:      glColor3b,glColor3d,glColor3f,glColor3i,glColor3s,glColor3ub,glColor3ui,glColor3us,glColor4b,glColor4d,glColor4f,glColor4i,glColor4s,glColor4ub,glColor4ui,glColor4us,glColor3bv,glColor3dv,glColor3fv,glColor3iv,glColor3sv

OpenGL函数思考-gluLookAt

OpenGL函数思考-gluLookAt 函数原型:       void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz) 参数说明:       eyex, eyey,eyez 指定视点的位置 centerx,centery,centerz 指定参考点的位置

OpenGL函数思考-glClear

OpenGL函数思考-glClear 函数原型:       void glClear(GLbitfield mask); 参数说明:       GLbitfield:可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位       GL_COLOR_BUFFER_BIT:    当前可写的颜色缓冲       GL_DEPTH_B

OpenGL函数思考-glLoadIdentity

OpenGL函数思考-glLoadIdentity 函数原型:      void glLoadIdentity(void) 函数说明:       OpenGL为我们提供了一个非常简单的恢复初始坐标系的手段,那就是调用glLoadIdentity()命令.该命令是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化.也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态.       单

OpenGL函数思考-glTexImage2D

OpenGL函数思考-glTexImage2D 函数原型:       void glTexImage2D(GLenum target,GLint level,GLint components,GLsizei width, glsizei height,GLint border,GLenum format,GLenum type, const GLvoid *pixels); 函数说明:       定义一个二维纹理映射.其中       参数target是常数GL_TEXTURE_2D.   

OpenGL函数思考-glOrtho

  OpenGL函数思考-glOrtho 函数原型: void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far) 参数说明: 函数说明:         glOrtho()这个函数设置正摄投影矩阵,一般在执行命令glMatrixMode(GL_PROJECTION)和glLoadidentity()之后使用:使用glOrtho函数可以将当前的可视空间设置为正投

OpenGL函数思考-gluPerspective

OpenGL函数思考-gluPerspective 函数原型:       void gluPerspective(GLdouble fovy, GLdouble aspect,GLdouble zNear,GLdouble zFar) 参数说明:       fovy:    指定视景体的视野的角度,以度数为单位,y轴的上下方向 aspect:指定你的视景体的宽高比(x 平面上) zNear: 指定观察者到视景体的最近的裁剪面的距离(必须为正数) zFar:    指定观察者到视景体的最远的裁

OpenGL函数思考-glRotatef

OpenGL函数思考-glRotatef 函数原型:       void glRotated(GLdouble angle,GLdouble x,GLdouble y,GLdouble z)       void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLdouble z) 函数说明:      这两个函数用来计算旋转矩阵,该矩阵围绕原点到点(x,y,z)的向量逆时针旋转angle度.