zoukankan      html  css  js  c++  java
  • Cocos2d中使用颜色混合:加算,减算

    转自http://blog.sina.com.cn/s/blog_7a2ffd5c0100xtid.html

    CCSprite有一个ccBlendFunc类型的blendFunc_结构体成员,可以用来设置描绘时的颜色混合方案。ccBlendFunc包含了一个src和一个dst,分别表示目标和源的运算因子。

        如果我们对一个Sprite使用setBlendFunc方法,如:

                 [Sprite setBlendFunc:(ccBlendFunc){GL_ONE,GL_ZERO} ];

        会以这个Sprite作为源,Sprite所在位置的其它像素作为目标,进行混合运算:

            源的RGBA变量:RsGsBsAs

            目标的RGBA  RdGdBdAd

            源的各个运算因子:  N_RsN_GsN_BsN_As

            目标的各个运算因子:   N_RdN_GdN_BdN_Ad

    混合后的RGBA为:(Rs*N_Rs+ Rd* N_RdGs*N_Gs+ Gd* N_Gd

                                    Bs*N_Bs+ Bd* N_BdAs*N_As+ Ad* N_Ad)

       其中的运算因子包括:

             GL_ONE1.0

             GL_ZERO0.0

             GL_SRC_ALPHA:源的Alpha值作为因子

             GL_DST_ALPHA:目标Alpha作为因子

             GL_ONE_MINUS_SRC_ALPHA1.0减去源的Alpha值作为因子

             GL_ ONE_MINUS_DST_ALPHA1.0减去目标的Alpha值作为因子

     

        我们可以在CCSpriteinit方法中看到,默认的状态下使用GL_ONE,GL_ONE_MINUS_SRC_ALPHA这两个参数,这也是我们看到的情况,Sprite会覆盖下面的描绘,但如果有透明的地方,则会显示下面的色值。让我们看一下说使用各个参数的效果:

        0:不改变混合,使用默认的情况:
        
     Cocos2d中使用颜色混合:加算,减算

        1:如果设置glBlendFunc(GL_ONE,GL_ZERO) 表面完全使用源颜色,即和不混合一样的效果,但是如果Sprite本身有透明的地方,则透明的地方会变成黑色。因为此时不显示目标的颜色。即使透明度为0也没有意义。
    Cocos2d中使用颜色混合:加算,减算

        2:如果设置glBlendFunc(GL_ZERO, GL_ONE),表示不使用源颜色,那么该Sprite便不被画出来。
      Cocos2d中使用颜色混合:加算,减算

        3:使用ALPHA相关的因子,会根据透明度来计算,比如透明度高的颜色占较大比重等。如默认情况。

     附:

    常数 相关因子 融合因子结果
    GL_ZERO 源因子或目的因子 (0,0,0,0)
    GL_ONE 源因子或目的因子 (1,1,1,1)
    GL_DST_COLOR 源因子 (Rd,Gd,Bd,Ad)
    GL_SRC_COLOR 目的因子 (Rs,Gs,Bs,As)
    GL_ONE_MINUS_DST_COLOR 源因子 (1,1,1,1)-(Rd,Gd,Bd,Ad)
    GL_ONE_MINUS_SRC_COLOR 目的因子 (1,1,1,1)-(Rs,Gs,Bs,As)
    GL_SRC_ALPHA 源因子或目的因子 (As,As,As,As)
    GL_ONE_MINUS_SRC_ALPHA 源因子或目的因子 (1,1,1,1)-(As,As,As,As)
    GL_DST_ALPHA 源因子或目的因子 (Ad,Ad,Ad,Ad)
    GL_ONE_MINUS_DST_ALPHA 源因子或目的因子 (1,1,1,1)-(Ad,Ad,Ad,Ad)
    GL_SRC_ALPHA_SATURATE 源因子 (f,f,f,1); f=min(As,1-Ad)
  • 相关阅读:
    TensorFlow学习笔记--CIFAR-10 图像识别
    第二章--第二节:注释
    webbrowser
    RichViewEdit
    RichEdit
    TreeView
    RichView
    ListView
    DesktopLoader服务程序
    Delphi实现程序只运行一次并激活已打开的程序
  • 原文地址:https://www.cnblogs.com/linyawen/p/3334156.html
Copyright © 2011-2022 走看看