Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从GraphicBuffer读取时出现意外的像素数据布局_Android_C++_Opengl Es_Android Source - Fatal编程技术网

Android 从GraphicBuffer读取时出现意外的像素数据布局

Android 从GraphicBuffer读取时出现意外的像素数据布局,android,c++,opengl-es,android-source,Android,C++,Opengl Es,Android Source,我目前正在本地Android框架中的一个平台上工作,我使用GraphicBuffer分配内存,然后从中创建一个EGLImage。然后将其用作OpenGL中的纹理,我将渲染到该纹理(使用一个简单的全屏四边形) 问题是,当我从GraphicBuffer读取渲染的像素数据时,我希望它在内存中是线性RGBA格式,但结果是一个纹理,其中包含图像的三个平行较小克隆,并且像素重叠。也许这个描述没有说太多,但重点是实际的像素数据有意义,但内存布局似乎不是线性RGBA。我假设这是因为图形驱动程序以内部格式存储像素

我目前正在本地Android框架中的一个平台上工作,我使用GraphicBuffer分配内存,然后从中创建一个EGLImage。然后将其用作OpenGL中的纹理,我将渲染到该纹理(使用一个简单的全屏四边形)

问题是,当我从GraphicBuffer读取渲染的像素数据时,我希望它在内存中是线性RGBA格式,但结果是一个纹理,其中包含图像的三个平行较小克隆,并且像素重叠。也许这个描述没有说太多,但重点是实际的像素数据有意义,但内存布局似乎不是线性RGBA。我假设这是因为图形驱动程序以内部格式存储像素,而不是线性RGBA

如果我渲染到标准的OpenGL纹理并使用glReadPixels读取,那么一切都可以正常工作,因此我假设问题在于使用GraphicBuffer的自定义内存分配

如果原因是驱动程序的内存布局,有没有办法强制布局为线性RGBA?我尝试了提供给GraphicBuffer构造函数的大多数使用标志,但没有成功。如果没有,是否有方法在着色器中以不同方式输出数据以“取消”内存布局

我正在为Nexus5构建Android 4.4.3

//Allocate graphicbuffer
outputBuffer = new GraphicBuffer(outputFormat.width, outputFormat.height, outputFormat.bufferFormat,
        GraphicBuffer::USAGE_SW_READ_OFTEN |
        GraphicBuffer::USAGE_HW_RENDER |
        GraphicBuffer::USAGE_HW_TEXTURE);

/* ... */

//Create EGLImage from graphicbuffer
EGLint eglImageAttributes[] = {EGL_WIDTH, outputFormat.width, EGL_HEIGHT, outputFormat.height, EGL_MATCH_FORMAT_KHR,
        outputFormat.eglFormat, EGL_IMAGE_PRESERVED_KHR, EGL_FALSE, EGL_NONE};

EGLClientBuffer nativeBuffer = outputBuffer->getNativeBuffer();

eglImage = _eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, nativeBuffer, eglImageAttributes);

/* ... */

//Create output texture
glGenTextures(1, &outputTexture);
glBindTexture(GL_TEXTURE_2D, outputTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eglImage);

/* ... */

//Create target fbo
glGenFramebuffers(1, &targetFBO);
glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0);

glBindFramebuffer(GL_FRAMEBUFFER, 0);
/* ... */
//Read from graphicbuffer
const Rect lockBoundsOutput(quadRenderer->outputFormat.width, quadRenderer->outputFormat.height);

status_t statusgb = quadRenderer->getOutputBuffer()->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &result);

我自己设法找到了答案,但我一直都错了。原因很简单,虽然我渲染的是480x1080纹理,但分配的内存已填充到640x1080,因此我只需要在每行之后删除填充,输出纹理才有意义。

Hey,我试图实现完全相同的东西,但根据这一点,不可能从
GraphicBuffer
对象读取纹理。你能分享它的代码吗?你是什么意思?如果渲染到基于GraphicBuffer的纹理,则只需使用lock()函数同步渲染并获取指向GraphicBuffer的指针,即可读取纹理。