您的位置:首页 > 运维架构

OpenGL混合函数 glBlendFunc()

2014-05-21 23:09 316 查看


在OpenGL中绘制的时候,有时候想使新画的颜色和已经有的颜色按照一定的方式进行混合,比如想使物体拥有半透明的效果,或者绘制叠加光亮的效果,这时候就要用到glBlendFunc()函数。

看名字就知道,用它的原因就是,我们需要把几种颜色通过混合来达到半透明或其它我们需要的效果。

拿半透明效果来说,已经画了红色和白色两个长方形,想在上面画一个半透明的绿色方形,则画在红色上的绿色其实就是绿色和红色混合了之后的颜色:

transparent Green1 = (%a*RED+(1-%a)GREEN);

画在白色上面的绿色是绿色和白色混合了之后的效果:

transparent Green2 = (%a*WHITE+(1-%a)GREEN);

这里详细的解释一下glBlendFunc()的函数原型,各种参数的意义,以及用法。

1. 混合函数的函数原型是:

void glBlendFunc(GLenum srcfactor, GLenum destfactor);

它的功能就控制了新画上来的颜色(source values, RGBA),和已经在帧缓冲区的颜色(destination values, RGBA)怎么来混合。

src是源的简写,dest是目标的简写。

2. 参数:

参数 srcfactor:

指定了新来的颜色(source values)如何被运算。九个枚举型被接受使用:

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.

参数 destfactor:

指定帧缓冲区的颜色(destination values)如何被运算。八个枚举型被接受使用:

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

下表表示了每个枚举变量代表的意思:

(Rs, Gs, Bs, As) 和 (Rd, Gd, Bd, Ad) 分别表示 源颜色(src) 和 目标颜色(dest)

颜色的各个通道R, G, B, A的最大值是(kR, kG, kB, kA)

i = min (As, kA, Ad) / /kA

_________________________________________________________________________

GL_ZERO | (0,0,0,0)

GL_ONE | (1,1,1,1)

GL_SRC_COLOR | (Rs/kR,Gs/kG,Bb/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)

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)

---------------------------------------------------------------------------------------------------------------------

在RGB模式中,Opengl按照下面的方程来计算最后得到的颜色:(srcfactor: Sr, Sg, Sb, Sa; destfactor: Dr, Dg, Db, Da)

R (d) = min(kR,RsSr+RdDr)

G (d) = min(kG,GsSg+GdDg)

B (d) = min(kB,BsSb+BdDb)

A (d) = min(kA,AsSa+AdDa)

实现透明效果的时候,最佳参数是将不同物体从远到近依次画出(有时候顺序很重要),并设置混合方程为:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;

void display(void)

{

...

////draw solid models here;

//glColor4f(1.0, 1.0, 1.0, 0.3);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//设置混合方式

glEnable(GL_BLEND);//启用混合

////draw transparent models here;

glDisable(GL_BLEND);//禁止混合

...

}

下图是基于混合函数:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 来渲染的透明效果图:

如果希望启用blend后得到多层比较平滑的半透明效果,请参看透明技巧



MSDN的链接(英文): http://msdn.microsoft.com/en-us/library/ms537046


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: