zoukankan      html  css  js  c++  java
  • Pangolin中opengl的混合(gl_blend)

    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、设 读/写 深度检测

    以下对混合算法进行测试,统一使用glBlendFunc(GL_SRC_ALPHA,GL_ONE);模式。

    glClearColor(0.0f,1.0f,0.0f,0.5f);               //绿色背景(目标)、先放入帧缓冲区

    glColor4f(1.0f,0.0f,0.0f,0.5f);                    //矩形颜色(源色)、片段

    计算结果:

    (0.5f, 1.0f,0.0f,0.75f)

    绿色背景,红色矩形

           混合 混合  混合

           关闭混合时                        打开混合时            叠加时颜色

    结果:

    1、背景色也参与混合过程;

    2、利用绿色背景测试可得,RGBA中的A值对单一颜色显示没有效果,但混合和

    透明是依靠A值计算的;

    3、当输入颜色值为RGB时,混合计算时,A值默认为0.0。

    参考博文:http://blog.csdn.net/hudfang/article/details/46726465

  • 相关阅读:
    Cocos2d JS 之消灭星星(二) 工具类开发
    Cocos2d JS 之消灭星星(三) 进入游戏过渡场景
    Cocos2d JS 之本地存储(localStorage)
    Cocos2d JS 之消灭星星(—) 游戏初始化场景的建立
    小程序的1024KB
    小程序来了(下篇)
    小程序来了(上篇)
    那些年,让我们一起着迷的Spring
    小程序之信息触手可及
    史诗手册!微信小程序新手自学入门宝典!
  • 原文地址:https://www.cnblogs.com/feifanrensheng/p/8623811.html
Copyright © 2011-2022 走看看