我在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);
}
当放置在白色背景上时,这应该是不可见的。但是,实际上我得到了这个:
如果我使用UIGraphicsGetCurrentContext()
在UIKit中做同样的事情,那么它在没有黑色发际线的情况下完美无缺。
任何人都可以告诉我如何让它在没有狡猾的人工制品的情况下渲染alpha通道吗?
答案 0 :(得分:2)
看起来渲染是使用不适合预乘颜色的glBlendFunc
完成的。
有两个(和一半)选项可以解决这个问题:
将混合功能设置为glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
。我不知道这个Cocos2D的东西,如果你可以影响混合功能或者告诉它使用预乘颜色。
不要在位图上下文中使用预乘颜色。我不确定iOS上是否支持生成的像素格式。
如果一切都是白色的,您可以将data
的RGB部分设置为0xFFFFFF,并在创建纹理之前将alpha保留在原位。
编辑:这里的代码描绘了纹理白色的所有内容:
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