gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:19 24 4
gpt4 key购买 nike

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

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

如果我渲染为标准 OpenGL 纹理并使用 glReadPixels 读取,一切正常,所以我认为问题出在我使用 GraphicBuffer 的自定义内存分配上。

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

我正在为 Nexus 5 构建 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,所以我只需要在每一行之后删除填充,输出纹理就有意义了。

关于android - 从 GraphicBuffer 读取时出现意外的像素数据布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24448977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com