2

GLKView:snapshotメソッドの使用方法がわかりません。

GLKViewを使用してOpenGLのものをレンダリングしています。それはすべて機能します。すべて正しく設定されているようです。

しかし、スナップショットを作成しようとすると失敗します。nullの戻り値が返され、次のログメッセージが表示されます。

エラー:CGImageCreate:無効な画像サイズ:0x0。

このように見えるのは、ビュー自体が何らかの理由で無効であることを意味しますが、そうではありません。これを除いて、すべてが機能しています。

私はいくつかのコードサンプルを見てきましたが、何も変わっていません。

だから...これを見た人はいますか?アイデア?

4

2 に答える 2

1

私は上記の問題を理解していませんでした。ただし、優れた回避策を見つけました。レンダリングバッファを読み取り、UIImageに保存するこのチャンクを見つけました。問題が解決しました!

- (UIImage*)snapshotRenderBuffer {

    // Bind the color renderbuffer used to render the OpenGL ES view
    // If your application only creates a single color renderbuffer which is already bound at this point, 
    // this call is redundant, but it is needed if you're dealing with multiple renderbuffers.
    // Note, replace "_colorRenderbuffer" with the actual name of the renderbuffer object defined in your class.
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

    NSInteger dataLength = backingWidth * backingHeight * 4;
    GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte));

    // Read pixel data from the framebuffer
    glPixelStorei(GL_PACK_ALIGNMENT, 4);
    glReadPixels(0.0f, 0.0f, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, data);

    // Create a CGImage with the pixel data
    // If your OpenGL ES content is opaque, use kCGImageAlphaNoneSkipLast to ignore the alpha channel
    // otherwise, use kCGImageAlphaPremultipliedLast
    CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, dataLength, NULL);
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGImageRef iref = CGImageCreate(
                                    backingWidth, backingHeight, 8, 32, backingWidth * 4, colorspace, 
                                    kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipLast,
                                    ref, NULL, true, kCGRenderingIntentDefault);

    // (sayeth abd)
    // This creates a context with the device pixel dimensions -- not points. 
    // To be compatible with all devices, you're meant to keep everything as points and a scale factor;  but,
    // this gives us a scaled down image for purposes of saving.  So, keep everything in device resolution,
    // and worry about it later...
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(backingWidth, backingHeight), NO, 0.0f);
    CGContextRef cgcontext = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(cgcontext, kCGBlendModeCopy);
    CGContextDrawImage(cgcontext, CGRectMake(0.0, 0.0, backingWidth, backingHeight), iref);

    // Retrieve the UIImage from the current context
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    // Clean up
    free(data);

    return image;
}
于 2012-08-18T17:16:10.223 に答える
0

おそらくこれはあなたの場合には当てはまりませんが、GLKView:snapshotのドキュメントには次のように書かれています。

描画関数内でこのメソッドを呼び出さないでください。

于 2012-08-07T09:36:00.537 に答える