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)
这是一个驱动程序错误.就那么简单.
驱动程序在视频内存中的表面间距错误.您可以在上面的行中清楚地看到这一点.此外,您在图像下部看到的垃圾是驱动程序认为存储图像的存储器,但存在不同的数据.可能是纹理/顶点数据.
对不起,我知道无法解决这个问题.您可以通过不同的表面格式或启用/禁用多重采样获得更好的运气.
最后,它缺乏记忆力."new uint8 [dataLength];" 永远不会返回一个存在的指针,因此整个过程都被破坏了.
TomA,你清理缓冲区的想法实际上帮助我解决了这个问题.谢谢.