Opengl 相关

void CMainWindow::InitGL()
{
    glEnable(GL_TEXTURE_2D); // Enable 2D texturing 启用二维文理
    glShadeModel(GL_FLAT);   // Choose a smooth shading model 单色(相对于渐变色)
    glClearColor(0.0, 0.0, 0.0, 0.0); // Set the clear color to black 清空缓冲区颜色(这里设置为黑色)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //混合 透明效果
    glEnable(GL_BLEND); //启用颜色混合
}

注:

void glShadeModel(GLenum mode);

mode   指明使用哪种着色技术,可以取值GL_FLAT和GL_SMOOTH。默认取值是GL_SMOOTH
来自 http://blog.youkuaiyun.com/wangyuchun_799/article/details/7803756
在使用顶点数据绘制几何图形时,如果为每个顶点指定了顶点颜色,此时若使用GL_SMOOTH,每个顶点使用对应的顶点颜色来着色,而顶点之间的片元颜色则使用差值的方式来计算获得,结果就是渐变色;而若使用GL_FLAT,假设几何图形由n个三角形构成,则只会使用顶点颜色数组中最后n个颜色进行着色。

GL_SMOOTH着色模式

GL_FLAT着色模式


glBlendFunc

来自:http://xiaxveliang.blog.163.com/blog/static/29708034201262372615577/

在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);//禁止混合

...

}

 
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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值