iPhone OpenGLES 2.0文本纹理带有奇怪的边框(不是笔画)问题

时间:2011-05-19 14:53:11

标签: iphone objective-c opengl-es opengl-es-2.0

我正在使用CoreGraphcis来创建文本纹理。不幸的是,文本呈现方式(文本颜色与背景相同,以展示奇怪的边框)。

enter image description here

我尝试过使用笔触颜色和边框,我认为它适用于OpenGLES 2.0而不是CoreGraphics。

// Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
    glGenFramebuffers(1, &defaultFramebuffer);
    glGenRenderbuffers(1, &colorRenderbuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);

    glActiveTexture(GL_TEXTURE0);
    glUniform1i(uniforms[UNIFORM_SAMPLER], 0);

    // Set up the texture state.
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    texture = [[FW2Texture alloc] initWithString:@"Text"];
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.width, texture.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.imageData);

核心图形位:

-(id)initWithString:(NSString*)str {
if((self = [super init])) {
    UIFont *font = [UIFont systemFontOfSize:17];
    CGSize size = [str sizeWithFont:font];

    NSInteger i;

    width = size.width;
    if((width != 1) && (((int)width) & (((int)width) - 1))) {
        i = 1;
        while(i < width)
            i *= 2;
        width = i;
    }

    height = size.height;
    if((height != 1) && (((int)height) & (((int)height) - 1))) {
        i = 1;
        while(i < height)
            i *= 2;
        height = i;
    }

    NSInteger BitsPerComponent = 8;

    int bpp = BitsPerComponent / 2;
    int byteCount = width * height * bpp;
    uint8_t *data = (uint8_t*) calloc(byteCount, 1);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big;
    CGContextRef context = CGBitmapContextCreate(data,
                                                 width,
                                                 height,
                                                 BitsPerComponent,
                                                 bpp * width,
                                                 colorSpace,
                                                 bitmapInfo);
    CGColorSpaceRelease(colorSpace);

    CGContextSetGrayFillColor(context, 0.5f, 1.0f);
    CGContextTranslateCTM(context, 0.0f, height);
    CGContextScaleCTM(context, 1.0f, -1.0f);
    UIGraphicsPushContext(context);

    [str drawInRect:CGRectMake(0,
                               0,
                               size.width,
                               size.height)
           withFont:font
      lineBreakMode:UILineBreakModeWordWrap
          alignment:UITextAlignmentCenter];
    UIGraphicsPopContext();
    CGContextRelease(context);

    imageData = (uint8_t*)[[NSData dataWithBytesNoCopy:data length:byteCount freeWhenDone:YES] bytes];
}
return self;

}

1 个答案:

答案 0 :(得分:3)

你的glBlendFunc是什么?你正在从CoreGraphics中获取预乘alpha,所以例如代替边界像素为(r,g,b,0.5),它将是(0.5 * r,0.5 * g,0.5 * b,0.5)。这意味着你应该使用glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)复合启用混合,这样你就可以获得srcColour +(1-alpha of srcColour)* dstColour。