2017-10-11 171 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