注意:
a.在颜色索引模式下不能指出alpha值,因此混合操作在颜色索引模式下是非法的。
1.混合
RGB是片段的颜色,Alpha值可以看成是片段的透明度。
1.1 glEnable (GL_BLEND);//开启混合
1.2 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_ALPHA和GL_ONE_MINUS_SRC_ALPHA是最常使用的,表透明。
使用GL_ONE(源)和GL_ZERO(目标)的结果相当于禁用混合功能。
1.3 void glBlendEquation(GLenum mode);//混合方程式,默认使用加法
Cs和Cd表示源颜色和目标颜色, S和D表示函数glBlendFunc()或glBlendFuncSeparate()指定的源混合因子和目标混合因子。
GL_FUNC_ADD CsS + CdD
GL_FUNC_SUBTRACT CsS - CdD
GL_FUNC_REVERSE_SUBTRACT CdD- CsS
GL_MIN min(CsS, CdD)
GL_MAX max(CsS,CdD)
1.4 混合实例:
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel (GL_FLAT);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable (GL_BLEND);
}
static void drawLeftTriangle(void)//yellow
{
glBegin(GL_TRIANGLES);
glColor4f(1.0,1.0,0.0,0.75);
glVertex3f(0.1,0.9,0.0);
glVertex3f(0.1,0.1,0.0);
glVertex3f(0.7,0.5,0.0);
glEnd();
}
static void drawRightTriangle(void)//
{
glBegin(GL_TRIANGLES);
glColor4f(0.0,1.0,1.0,0.75);
glVertex3f(0.9,0.9,0.0);
glVertex3f(0.3,0.5,0.0);
glVertex3f(0.9,0.1,0.0);
glEnd();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
if(leftFirst)
{
drawLeftTriangle();//已存储像素,目标,0.75
drawRightTriangle();//新片段,源,0.25,透明
}
else
{
drawRightTriangle();
drawLeftTriangle();
}
glFlush();
}
结果如下图:
另解释gluOrtho2D函数:
因为图形的尺寸为单位尺寸,而窗口尺寸比较大,所以图形正投影到屏幕时,需要适应屏幕的尺寸大小。
void reshape(int w,int h)
{
glViewport(0.0,0.0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat nRange=1.0;
if(w<=h)
gluOrtho2D(0.0,nRange,0.0,nRange*h/w);
else
gluOrtho2D(0.0,nRange*w/h,0.0,nRange);
}