cocos2d-x下的glTexSubImage2D如何正确使用

190191
我用一片内存重新创建texture,颜色值全填成0x000000FF(GL_RGBA),alpha为0,理论上应该整张纹理
全透明才对,为什么看到的效果还带有一定的alpha效果呢?请看下图的代码和效果图!

void test_glTexSubImage2D(CCSprite * lpSpriteNode)
{
do
{
CCTexture2D * thisTexture = lpSpriteNode->getTexture();

CC_BREAK_IF(thisTexture->getPixelFormat() != kCCTexture2DPixelFormat_RGBA8888);

CCSize tagSize = CCSizeMake(thisTexture->getPixelsWide(), thisTexture->getPixelsHigh());
int dwColorMax = tagSize.width * tagSize.height;
ccColor4B * lpTmpBuffer = new ccColor4B;

CC_BREAK_IF(lpTmpBuffer == NULL);

ccColor4B * thisColor = lpTmpBuffer;
for(int i = 0; i < dwColorMax; ++i, ++thisColor)
{
thisColor->r = 0xFF;
thisColor->g = 0x0;
thisColor->b = 0x0;
thisColor->a = 0x0;
}

glPixelStorei(GL_UNPACK_ALIGNMENT,1); 
glBindTexture(GL_TEXTURE_2D, thisTexture->getName());
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tagSize.width, tagSize.height, GL_RGBA, GL_UNSIGNED_BYTE, lpTmpBuffer);

CC_SAFE_DELETE(lpTmpBuffer);
}while(0);
}

cocos2d的位图数据都是使用premultiplied alpha的,默认混合使用GL_ONE以优化渲染。
这个处理是在加载时图片时进行的转换。见
CCTexture2D::initPremultipliedATextureWithImage(),因此CCTexture2D内的data已非原始的raw数据。变更混合模式是一个方法,但你也可以将你手动填充的raw数据用CC_RGB_PREMULTIPLY_APLHA宏转一下。

生成Texture的代码看不出什么问题,是不是使用这个纹理的时候 glBlendFunc的设置不对?

你说的是正确的,我忽略了这blend这点,设置一下sprite的混合方式就对了,万分感谢

ccBlendFunc	tagBlendFunc;
	tagBlendFunc.src	= GL_SRC_ALPHA;
	tagBlendFunc.dst	= GL_ONE_MINUS_SRC_ALPHA;
	lpSpriteNode->setBlendFunc(tagBlendFunc);

cocos2d的位图数据都是使用premultiplied alpha的,默认混合使用GL_ONE以优化渲染。
这个处理是在加载时图片时进行的转换。见
CCTexture2D::initPremultipliedATextureWithImage(),因此CCTexture2D内的data已非原始的raw数据。变更混合模式是一个方法,但你也可以将你手动填充的raw数据用CC_RGB_PREMULTIPLY_APLHA宏转一下。