2017-02-07 1 views
0

OpenGLビューをUIWindowに追加してSkiaを使用して描画することはできますか?通常のiOSアプリケーション(UIWindowベース)でGPU加速SkCanvasを使用するには?

私たちは、このようなビューを初期化する例、見つかった:

- (void)initialize { 
    CAEAGLLayer* layer = (CAEAGLLayer*)self.layer; 

    layer.opaque = NO; 
    layer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking: @(NO), 
            kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8}; 

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
     if (!self.context || ![EAGLContext setCurrentContext:self.context]) 
     NSLog(@"Cannot create EAGLContext!"); 

    GLuint framebuffer; 
    GLuint renderbuffer; 
    glGenFramebuffers(1, &framebuffer); 
    glGenRenderbuffers(1, &renderbuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); 

    [self.context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)layer]; 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer); 

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    if (status != GL_FRAMEBUFFER_COMPLETE) 
     NSLog(@"Failed to make complete frame buffer: %x", status); 

    CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawFrame:)]; 
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
} 

- (void)drawFrame:(CADisplayLink*)sender { 
    glClearColor(1.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    [self.context presentRenderbuffer:GL_RENDERBUFFER]; 
} 

赤背景が描かれているが、私はSkiaは、このビューで作業することはできません。

マイskiaコード:

const GrGLInterface* glInterface = GrGLCreateNativeInterface(); 
NSAssert(glInterface->validate(), nil); 

GrContextOptions contextOptions; 
GrContext* grContext = GrContext::Create(kOpenGL_GrBackend, (intptr_t)glInterface, contextOptions); 
sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); 

GrBackendRenderTargetDesc grBackendRenderTargetDesc; 

// This is GLuint framebuffer value from view setup code above. 
grBackendRenderTargetDesc.fRenderTargetHandle = self.framebufferID; 

grBackendRenderTargetDesc.fWidth = self.rboWidth; 
grBackendRenderTargetDesc.fHeight = self.rboHeight; 
grBackendRenderTargetDesc.fConfig = kRGBA_8888_GrPixelConfig; 
grBackendRenderTargetDesc.fOrigin = kTopLeft_GrSurfaceOrigin; 
grBackendRenderTargetDesc.fSampleCnt = 0; 
grBackendRenderTargetDesc.fStencilBits = 0; 

SkSurfaceProps skSurfaceProps(0, kUnknown_SkPixelGeometry); 
sk_sp<SkSurface> skSurface = SkSurface::MakeFromBackendRenderTarget(grContext, grBackendRenderTargetDesc, &skSurfaceProps); 

if (skSurface) 
{ 
    skCanvas = skSurface->getCanvas(); 

    SkPaint paint; 
    paint.setColor(SK_ColorGREEN); 
    skCanvas->drawPaint(paint); 
} 

私はキャンバスのドローコードを配置すると、[... drawFrame:] [presentRenderbuffer self.context:GL_RENDERBUFFER]前に、それが何かを描画しません。

私には何が欠けていますか? SkSurface/SkCanvasと指定されたEAGLContextをどのようにリンクする必要がありますか。skia描画コードをどのように呼び出して正しく動作させる必要がありますか?

答えて

0

予想通り、私は

[self.context presentRenderbuffer:GL_RENDERBUFFER]; 
を呼び出す前に、私はすべてのSkiaの描画コードの後

skSurface->prepareForExternalIO() 

を呼び出したときにそれが動作します

関連する問題