2017-10-11 24 views
0

CoreGraphicsの透明な背景を持つOpenGLコンテキストの画像をレンダリングできません。CoreGraphics OpenGLの画像レンダリングに黒い背景がある

レンダリングされたイメージの背景が黒です。

これはドローコード

GLint default_frame_buffer = 0; 
    glGetIntegerv(GL_FRAMEBUFFER_BINDING, &default_frame_buffer); 
    if (default_frame_buffer == 0) { 
     target = createBMGLRenderTarget(width, height); 
     setFiltering(target, BMGL_BilinearFiltering); 
     glBindFramebuffer(GL_FRAMEBUFFER, target->framebuffer); 
    } 

    glViewport(0, 0, width, height); 

    if (background) { 
     CGFloat red, green, blue, alpha; 
     [background getRed:&red green:&green blue:&blue alpha:&alpha]; 
     glClearColor(red, green, blue, alpha); 
    } else { 
     glClearColor(0.f, 0.f, 0.f, 0.f); 
    } 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    drawer.draw() 

    glFlush(); 
    glFinish(); 

    GLubyte *data = (GLubyte *)malloc(width * height * 4); 
    glPixelStorei(GL_PACK_ALIGNMENT, 4); 
    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); 

    CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, width * height * 4, NULL); 
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
    CGImageRef imgRef = CGImageCreate(width, height, 8, 32, width * 4, colorspace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast, ref, NULL, NO, kCGRenderingIntentDefault); 

    UIGraphicsBeginImageContextWithOptions(size, YES, 0.0); 
    CGContextRef cgContext = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(cgContext, kCGBlendModeCopy); 
    CGContextDrawImage(cgContext, CGRectMake(0, 0, size.width, size.height), imgRef); 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    free(data); 
    CGDataProviderRelease(ref); 
    CGColorSpaceRelease(colorspace); 
    CGImageRelease(imgRef); 

である私は、特に偽ならびに異なるブレンドモードに不透明に設定しようとしたが、それはまだ元の鮮明な画像に、黒の背景を追加します。透明な背景を持つようにGLKViewを設定することはできますが、画像をレンダリングしてその内容をCGImageに描画することはできません。

これはなぜですか?

+0

これはおそらく役に立ちます:https://stackoverflow.com/questions/5283670/displaying-an-eaglview-with-transparent-background-on-a-uiimageview –

+0

ありがとう、私は透明な背景でレンダリングすることができますGLKViewは、これを別のコンテキストにレンダリングするときだけ、背景が黒です。また、除外したいアニメーションの追加図面があるので、単にGLKView階層からイメージを取得することはできません。 – jarryd

答えて

1

生のRGBAデータからUIImageを作成する方法に問題があると思います。これを確認するには、あなたが知っているピクセル上のデータが透明であることを確認することができます。 data[pixelIndex*4 + 3]のように、透明であることが期待される場所でゼロにする必要があります。透明でない場合、問題はOpenGLの部分にあります。

とにかく、画像が透明でない可能性が最も高いのは、kCGImageAlphaPremultipliedLastを使用してアルファを事前に増やしているということです。 kCGBitmapByteOrder32Big|kCGImageAlphaLastを試してみてください。

+0

私はこれをCIImageFilter - CIMaskToAlphaで解決してから、テンプレートモードで画像を描画し、imageViewの色合いの色を設定しました – jarryd

関連する問題