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)
{
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)