为什么我在Cocos2D中的32位上下文中出现黑线?

时间:2014-10-16 14:09:44

标签: ios cocos2d-iphone core-graphics cgcontext

我在Cocos2D中渲染自己的精灵有问题。如果我创建一个上下文,即使假设是一个预乘的alpha,我也会得到黑色的文物。以下代码应生成一个完全白色的圆圈:

- (void)renderTest
{
    CGRect rect = CGRectMake(0, 0.0, 100.0, 100.0);

    unsigned char *data = calloc((int)rect.size.width * (int)rect.size.height, 4);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(data, (int)rect.size.width, (int)rect.size.height, 8, (int)rect.size.width*4, colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);

    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextAddArc(context, rect.size.width / 2, rect.size.height / 2, rect.size.width * 0.4, 0.0, 2 * M_PI, 0);
    CGContextFillPath(context);

    CCTexture2D *tex = [[CCTexture2D alloc] initWithData:data pixelFormat:kCCTexture2DPixelFormat_RGBA8888 pixelsWide:rect.size.width pixelsHigh:rect.size.height contentSize:rect.size];

    self.texture = tex;
    self.textureRect = rect;

    free(data);
    CGContextRelease(context);
}

当放置在白色背景上时,这应该是不可见的。但是,实际上我得到了这个:

enter image description here

如果我使用UIGraphicsGetCurrentContext()在UIKit中做同样的事情,那么它在没有黑色发际线的情况下完美无缺。

任何人都可以告诉我如何让它在没有狡猾的人工制品的情况下渲染alpha通道吗?

1 个答案:

答案 0 :(得分:2)

看起来渲染是使用不适合预乘颜色的glBlendFunc完成的。

有两个(和一半)选项可以解决这个问题:

  1. 将混合功能设置为glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)。我不知道这个Cocos2D的东西,如果你可以影响混合功能或者告诉它使用预乘颜色。

  2. 不要在位图上下文中使用预乘颜色。我不确定iOS上是否支持生成的像素格式。

  3. 如果一切都是白色的,您可以将data的RGB部分设置为0xFFFFFF,并在创建纹理之前将alpha保留在原位。

  4. 编辑:这里的代码描绘了纹理白色的所有内容:

    uint32_t *ptr = (uint32_t *)data;
    void *end = data + CGBitmapContextGetBytesPerRow(context) * CGBitmapContextGetHeight(context);
    while (ptr != end)
        *ptr++ |= 0xffffff; // or 0xffffff00, depending on endianess and pixel format in context