OpenGL颜色混合

Blend 混合是将源色和目标色以某种方式混合生成特效的技术。混合常用来绘制透明或半透明的物体。在混合中起关键作用的α值实际上是将源色和目标色按给定比率进行 混合,以达到不同程度的透明。α值为0则完全透明,α值为1则完全不透明。混合操作只能在RGBA模式下进行,颜色索引模式下无法指定α值。物体的绘制顺 序会影响到OpenGL的混合处理。

 

glEnable( GL_BLEND ); // 启用混合
glDisable( GL_BLEND ); // 禁用关闭混合

 

获得混合的信息
glGet( GL_BLEND_SRC );
glGet( GL_BLEND_DST );
glIsEnable( GL_BLEND );

 

glBlendFunc( GLenum sfactor , GLenum dfactor ); // 混合函数
sfactor 源混合因子
dfactor 目标混合因子

 

混合因子枚举

 

GL_DST_ALPHA( Ad , Ad , Ad , Ad )
GL_DST_COLOR( Rd , Gd , Bd , Ad )
GL_ONE ( 1 , 1 , 1 , 1 )
GL_ONE_MINUS_DST_ALPHA ( 1 , 1 , 1 , 1 ) - ( Ad , Ad , Ad , Ad )
GL_ONE_MINUS_DST_COLOR ( 1 , 1 , 1 , 1 ) - ( Rd , Gd , Bd , Ad )
GL_ONE_MINUS_SRC_ALPHA ( 1 , 1 , 1 , 1 ) - ( As , As , As , As )
GL_SRC_ALPHA ( As , As , As , As )
GL_SRC_ALPHA_SATURATE ( f, f , f , 1 ) : f = min( As , 1 - Ad )
GL_ZERO( 0 , 0 , 0 , 0 )


glBlendFunc( GL_ONE , GL_ZERO ); // 源色将覆盖目标色。
glBlendFunc( GL_ZERO , GL_ONE ); // 目标色将覆盖源色。

 

glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); // 是最常使用的。
若源色为 ( 1.0 , 0.9 , 0.7 , 0.8 )
源色使用 GL_SRC_ALPHA
即 0.8*1.0 , 0.8*0.9 , 0.8*0.8 , 0.8*0.7
结果为 0.8 , 0.72 , 0.64 , 0.56

 

目标色为 ( 0.6 , 0.5 , 0.4 , 0.3 )
目标色使用GL_ONE_MINUS_SRC_ALPHA
即 1 - 0.8 = 0.2
0.2*0.6 , 0.2*0.5 , 0.2*0.4 , 0.2*0.3
结果为 0.12 , 0.1 , 0.08 , 0.06

 

由此而见,使用这个混合函数,源色的α值决定了结果颜色的百分比。
这里源色的α值为0.8,即结果颜色中源色占80%,目标色占20%。

 

将多边形从远至近排列,并使用以下函数
glBlendFunc( GL_SRC_ALPHA_SATURATE , GL_ONE );
glEnable( GL_POLYGON_SMOOTH );
可以优化多边形反走样;但必须有α位平面,以用来存储累加的覆盖值。

 

 

 

混合 3D 物体

 

混合 3D 物体时,基本原理和混合 2D 物体一样,但需要将深度检测关闭或设置为只读。
因为深度检测会剔除被遮挡的部分物体。

 

glEnable( GL_DEPTH_TEST ); // 启用深度缓存
glDisable( GL_DEPTH_TEST ); // 禁用深度缓存

glDepthMask( GL_FALSE ); // 深度缓存为 只读
glDepthMask( GL_TRUE ); // 深度缓存为 读/写

 

按以下步骤,可以在 3D 场景中使用混合和深度检测

1.使用 深度检测。
2.绘制不透明的物体。
3.设只读 深度检测。
4.绘制半透明的物体。
5.设读/写 深度检测。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值