OpenGL ES - glReadPixels

Bil*_*ias 9 c++ android opengl-es ios marmalade

我正在使用glReadPixels截取屏幕截图,以在两个图像之间执行"交叉"效果.

在Marmalade SDK模拟器上,屏幕截图很好,"交叉"效果很有效: 在此输入图像描述

然而,这是它在iOS和Android设备上的外观 - 已损坏:http: //www.eikona.info/images/81269689420703803966.png

我总是将屏幕视为RGBA 1字节/通道,因为文档说它总是被接受.

以下是用于截屏的代码:

uint8* Gfx::ScreenshotBuffer(int& deviceWidth, int& deviceHeight, int& dataLength) {

    /// width/height
    deviceWidth = IwGxGetDeviceWidth();
    deviceHeight = IwGxGetDeviceHeight();
    int rowLength = deviceWidth * 4; /// data always returned by GL as RGBA, 1 byte/each

    dataLength = rowLength * deviceHeight;

    // set the target framebuffer to read
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glPixelStorei(GL_PACK_ALIGNMENT, 1);
    uint8* buffer = new uint8[dataLength];
    glReadPixels(0, 0, deviceWidth, deviceHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    return buffer;
}

void Gfx::ScreenshotImage(CIwImage* img, uint8*& pbuffer) {

    int deviceWidth, deviceHeight, dataLength;

    pbuffer = ScreenshotBuffer(deviceWidth, deviceHeight, dataLength);
    img->SetFormat(CIwImage::ABGR_8888);
    img->SetWidth(deviceWidth);
    img->SetHeight(deviceHeight);
    img->SetBuffers(pbuffer, dataLength, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

Nil*_*nck 5

这是一个驱动程序错误.就那么简单.

驱动程序在视频内存中的表面间距错误.您可以在上面的行中清楚地看到这一点.此外,您在图像下部看到的垃圾是驱动程序认为存储图像的存储器,但存在不同的数据.可能是纹理/顶点数据.

对不起,我知道无法解决这个问题.您可以通过不同的表面格式或启用/禁用多重采样获得更好的运气.


Bil*_*ias 5

最后,它缺乏记忆力."new uint8 [dataLength];" 永远不会返回一个存在的指针,因此整个过程都被破坏了.

TomA,你清理缓冲区的想法实际上帮助我解决了这个问题.谢谢.