2014-10-16 3 views
0

Cocos2D에서 스프라이트를 렌더링 할 때 문제가 있습니다. 컨텍스트를 만들면 아마 미리 곱셈 된 알파와도 관계없이 검정색 인공물이 생깁니다. 다음 코드는 완전한 흰색 원을 만들어야합니다.Cocos2D에서 32 비트 컨텍스트 주위에 검은 선이 나타나는 이유는 무엇입니까?

- (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()을 사용하여 정확히 같은 일을 할 경우는 검은 색 헤어 라인없이 완벽하게 작동합니다.

누구나 dodgy artifacts없이 알파 채널을 렌더링하는 방법을 알려주시겠습니까?

답변

2

미리 생성 된 색상에는 적합하지 않은 glBlendFunc으로 렌더링이 완료된 것처럼 보입니다.

은 두 가지이다 (반)이 문제를 해결하는 옵션 : glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)에 혼합 기능을 설정

  1. . 이 Cocos2D에 대해 전혀 알지 못합니다. 블렌드 함수에 영향을 미칠 수 있거나 미리 곱셈 된 색상을 사용하도록 지시 할 수 있는지 잘 모릅니다.

  2. 비트 맵 컨텍스트에서 미리 곱한 색상을 사용하지 마십시오. 비록 결과 픽셀 포맷이 iOS에서 지원되는지 모르겠습니다.

  3. 모든 것이 흰색 인 경우 data의 RGB 부분을 0xFFFFFF로 설정하고 텍스처를 만들기 전에 알파를 그대로두면됩니다.

편집 : 여기 코드는 그 흰색 당신의 텍스처 페인트의 모든 :

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 
+0

포인트 # self.blendFunc = (ccBlendFunc)'로 한 작품 {GL_ONE, GL_ONE_MINUS_SRC_ALPHA}'사실을 제외하고 불투명도 수준에서는 훌륭하게 재생되지 않습니다. 포인트 # 2 iOS에서 사용할 수있는 미리 곱셈되지 않은 32 비트 모드가 있는지 확실하지 않습니다. 포인트 3 나는 다음에 시도 할 것입니다! – jowie

+0

포인트 # 3은 불투명도 레벨과 페이드 애니메이션이 있더라도 훌륭하게 작동합니다. RGB 값을 사용자 지정 텍스트 색 매개 변수로 변경하면 다른 색으로 텍스트를 렌더링해야 할 필요가 있다고 생각합니다. 감사! – jowie