const BlendFunc BlendFunc::ALPHA_PREMULTIPLIED = {GL_ONE, GL_ONE_MINUS_SRC_ALPHA};
const BlendFunc BlendFunc::ALPHA_NON_PREMULTIPLIED = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA};
我看3.9默认的是ALPHA_PREMULTIPLIED ,但是studio上用的又是ALPHA_NON_PREMULTIPLIED ,平时图片打包工具也有这个勾选的选项,我想知道这个勾选要不要选上?有什么区别?
链接看了,我觉得不够透彻。链接里的文章并没有解释ALPHA_PREMULTIPLIED和ALPHA_NON_PREMULTIPLIED的区别,如果区别没说清楚,读者还是很难理解如何使用。
什么时候使用ALPHA_PREMULTIPLIED?
首先拿pvr .ccz文件来说。使用Texturepacker打包图片的时候,如果选择pvr.ccz格式,那么软件会提醒使用者勾上AlphaPremultipled选项。该选项的作用是打包的时候将图片alpha分量预先与RGB分量相乘。这样在程序里面渲染这张图时就可以通过设置混合参数来省去alpha分量与rgb分量相乘的操作,提高gpu渲染效率。链接里的文章有提到不同的混合参数的意义,这里就不多说了。
再拿png文件来说,如果看过引擎png加载部分的源码就会发现,引擎在处理RGBA8888格式的png图片时,会顺便做alpha预乘的操作,然后把相应的texture2d对象的AlphaPremultipled变量置为true,这就是为什么Sprite对象初始化时用的是ALPHA_PREMULTIPLIED混合参数了。因为png图片已经被处理成预乘后的结果了,只有使用ALPHA_PREMULTIPLIED才能正确还原图片颜色。而studio编辑器编辑的时候应该是没做预乘处理的所以用的是ALPHA_NON_PREMULTIPLIED。
如上,也解释了链接的文章里面最后一句“是因为“源颜色”的透明度为:1”到底说的是什么了。
因为二楼~~~,所以加精!





首先 cocos2d-x 里面 sprite 初始化的时候会根据纹理图片是否带透明通道强制的初始化一次 blendfuc 。
而编辑器中设置的的属性在加载的时候是在初始化之后设置的, 所以在编辑器中不能生硬的更改混合为一个低安全基本的属性, 而设置为了 ALPHA_NON_PREMULTIPLIED。
以上都是个人理解…