zoukankan      html  css  js  c++  java
  • Cocos2d-x 3.0心得(01)-图片载入与混合模式

    v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名歧视)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。


    v3.0在载入图片方面也有了非常大改变,仅仅只是是藏在水下的,不到出问题的时候就不easy发觉。

    简单来说,v2.2和之前的版本号,在iOS上,cocos2dx是利用原生的UIImage来载入图片,png、jpg之类的。大致的步骤:先用UIImage载入图片,再创建一个渲染环境并提供一个buffer。作为渲染的缓存,然后把UIImage(包括的CGImage)绘制到这个环境中。这时候buffer里面就是图片的像素数据了,能够用来创建gl纹理了。

    v3.0不再用iOS原生库载入图片,而是用了第三方的libpng、libjpeg等等库,在cocos2d/external以下能找到。

    新的方式不须要中间建渲染环境绘制的步骤。而是直接从图片文件解析到buffer,然后就能创建gl纹理。

    这个改动,无论是从效率还是代码一致性来看,都是一件好事。只是相对的,也带来了一些不习惯的东西。

    用v3.0做粒子会发现,用同样的设置,同样的图片,曾经好端端的效果。到了新版本号以下变成了一堆色块。

    查了一阵。最后把粒子的混合模式(BlendFunc)。从src = GL_ONE,dst = GL_ONE。改成src = GL_SRC_ALPHA,dst = GL_ONE。结果就恢复正常了。

    原因也不复杂。

    首先,我们使用的图片是一张纯白的、但又带半透明的图片。也就是,图片的RGB值是全255,但Alpha则是0 ~ 255,依据每一个像素的透明程度而定。在不论什么一个看图软件上,这张图都是中间白色、往四周逐渐变透明的亮度图,由于有alpha通道作半透明混合。

    但在程序上。src = GL_ONE表示忽略掉图片的alpha,直接使用RGB值来跟目标混合。由于图片的RGB是全255,所以渲染结果就成了全白的色块。

    改成src = GL_SRC_ALPHA。才会用图片alpha对RGB进行调制,得到正确的结果。

    嗯。那为什么曾经没问题?由于曾经载入图片。中间有一个从CGImage绘制到buffer的步骤,这个步骤里,实际上已经用图片的alpha对RGB进行了调制,所以buffer里面的RGB已经不是图片原始的RGB了。结果肯定就不一样了。

    顺便,假设用v2.2或者之前的版本号,发现有些图片或者粒子,在iOS上面显示正常。在Android上面是色块,非常可能跟这有关系。最好还是试试改混合模式。

    要想保留src = GL_ONE的设置,也不是没办法。

    对图片作预乘alpha(Premultiplied Alpha)。也就是,用图片的alpha先对RGB进行调制,然后存回RGB中,这种图片,就能够继续用src = GL_ONE了。能作这种处理的工具,嗯,TexturePacker就是一个。


    好了,关于混合模式,最后再来吐槽一下cocos2dx和cocosbuilder。

    1、cocosbuilder里,图片载入用的应该是原生库,所以用cocos2dx v3.0,在builder上没有所见即所得的效果。

    2、cocosbuilder里,假设CCSprite的混合模式设为src = one。dst = one - src alpha,那么在导出ccbi时,会忽略混合模式这一项抓狂坑爹哪。省这几个字节有半毛钱用?

    3、cocos2dx 3.0,从cocosbuilder解析粒子的时候,当解析到纹理这一步。会偷偷改掉混合模式骂人嗯哼。实际上,在对精灵和粒子设置Texture的时候,都能看到改动混合模式的身影。

    不用说,这绝壁是为了解决像上面那种混合的问题。可是对于那些想自己控制混合方式的人来说……反正,我是在美术跟我抱怨n次改了粒子混合模式没什么效果之后,才发现的抓狂

  • 相关阅读:
    Lambda 方法引用
    day7面向对象--进阶
    day6作业--选课系统
    day6面向对象--继承、多态
    day6面向对象
    day5模块学习--hashlib模块
    day5模块学习--configparser模块
    day5模块学习--yaml文件处理
    day5模块学习--XML模块
    day5模块学习--shelve模块
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10913381.html
Copyright © 2011-2022 走看看