Проблема чтения данных с помощью glreadpixel () при использовании буфера глубины и метода сглаживания - PullRequest
2 голосов
/ 18 июля 2011

Я хочу сделать снимок экрана моей игры, используя glreadpixel (). это работает хорошо над симулятором также на 2g iphone с версией ios 3.1.1. но на ipad с версией ios 4.2.1 это не так. я узнал вопрос об этом. для ios версии 4.0 выше на определенном устройстве (ipad) мы связываем буфер глубины и используем технику сглаживания. И когда мы используем glreadpixel () из opengl, который захватывает данные из буфера кадров, возвращает все 0 в целевом буфере ...

Если мы не привязываем буфер глубины к кадровому буферу и не используем технику сглаживания, она работает нормально.

код, который я использовал: -

CGRect screenBounds = [[UIScreen mainScreen] bounds];

int backingWidth = screenBounds.size.width;
int backingHeight =screenBounds.size.height;

NSLog(@"width : %f Height : %f",screenBounds.size.width,screenBounds.size.height);
CGSize esize = CGSizeMake(screenBounds.size.width, screenBounds.size.height);
NSInteger myDataLength = esize.width * esize.height * 4;
GLuint *buffer = (GLuint *) malloc(myDataLength);
glReadPixels(0, 0, esize.width, esize.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
for(int y = 0; y < backingHeight / 2; y++) {
    for(int xt = 0; xt < backingWidth; xt++) {
        GLuint top = buffer[y * backingWidth + xt];
        GLuint bottom = buffer[(backingHeight - 1 - y) * backingWidth + xt];
        buffer[(backingHeight - 1 - y) * backingWidth + xt] = top;
        buffer[y * backingWidth + xt] = bottom;
    }
}
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, releaseScreenshotData);
const int bitsPerComponent = 8;
const int bitsPerPixel = 4 * bitsPerComponent;
const int bytesPerRow = 4 * backingWidth;

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(backingWidth,backingHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
/*
UIImage *myImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
[snap setImage:myImage];
[self addSubview:snap];*/

Есть идеи, как включить информацию о глубине с помощью сглаживания при использовании glreadpixel () или любой другой подобной функции в opegl es?

Ответы [ 2 ]

4 голосов
/ 21 июля 2011

Разобрался!Перед вызовом glReadPixels ()

glBindFramebuffer(GL_FRAMEBUFFER, resolveFramebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
glReadPixels(xpos, ypos, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelByteArray);
glBindFramebuffer(GL_FRAMEBUFFER, sampleFrameBuffer);

необходимо связать буфер разрешения кадра с GL_FRAMEBUFFER. Перед рендерингом следующего кадра обязательно свяжите образец буфера кадра как GL_FRAMEBUFFER, но шаблон Apple по умолчанию уже делает это.

0 голосов
/ 19 июля 2011

Это не решит вашу проблему, но поможет настроить ваш поиск. Поскольку вы используете OpenGL- ES , glReadPixels() не сможет прочитать буфер глубины. В настоящее время у меня возникают те же проблемы с функциональностью моего приложения.

...