0

OpenGL ESシーンから画像を読み取るために次のコードを使用しています:

- (UIImage *)drawableToCGImage
{
CGRect myRect = self.bounds;
NSInteger myDataLength = myRect.size.width * myRect.size.height * 4;

glFinish();
glPixelStorei(GL_PACK_ALIGNMENT, 4);

int width = myRect.size.width;
int height = myRect.size.height;

GLubyte *buffer = (GLubyte *) malloc(myDataLength);
GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer2);
for(int y1 = 0; y1 < height; y1++) {
    for(int x1 = 0; x1 < width * 4; x1++) {
        buffer[(height - 1 - y1) * width * 4 + x1] = buffer2[y1 * 4 * width + x1];
    }
}

free(buffer2);

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, NULL);
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * myRect.size.width;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(myRect.size.width, myRect.size.height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
UIImage *image = [UIImage imageWithCGImage:imageRef];

CGImageRelease(imageRef);

return image;
}

iPad と古いバージョンの iPhone では完全に機能しますが、iPhone 6 (デバイスとシミュレーターの両方) ではモノクロの不具合のように見えることに気付きました。どうなり得るか?

また、CAEAGLLayer プロパティのコードは次のとおりです。

eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                @YES, kEAGLDrawablePropertyRetainedBacking,
                                kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];

誰かこのクレイジーな魔法に光を当ててくれませんか?

4

1 に答える 1

0

@MaticOblak のおかげで、問題が解決しました。

四角形サイズの float 値が正しく丸められなかったため、バッファーが正しく満たされていませんでした (そう、iPhone 6 の寸法のみ)。代わりに整数値を使用する必要があります。

UPD:私の問題は次のコードで修正されました:

GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);

int width = viewport[2];
int height = viewport[3];
于 2016-02-24T12:46:36.463 に答える