gpt4 book ai didi

ios - 为什么我在 Cocos2D 中的 32 位上下文周围有一条黑线?

转载 作者:行者123 更新时间:2023-11-28 21:56:19 25 4
gpt4 key购买 nike

我在 Cocos2D 中渲染自己的 Sprite 时遇到问题。如果我创建一个上下文,即使假设有一个预乘的 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

如果我在 UIKit 中使用 UIGraphicsGetCurrentContext() 做完全相同的事情,那么它可以完美地工作,没有黑色细线。

任何人都可以告诉我如何让它渲染 alpha channel 而没有狡猾的人工制品吗?

最佳答案

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

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

  1. 将混合函数设置为 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)。我不知道这个 Cocos2D 的东西,也不知道你是否可以影响混合函数或以其他方式告诉它使用预乘颜色。

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

  3. 如果一切都是白色的,您可以将 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

关于ios - 为什么我在 Cocos2D 中的 32 位上下文周围有一条黑线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26406551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com