OpenGL-混合

注意

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_ALPHAGL_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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值