gpt4 book ai didi

opengl-es-2.0 - 如何将图像数据的子矩形上传到 OpenGLES 2 帧缓冲区纹理?

转载 作者:行者123 更新时间:2023-12-04 03:43:31 26 4
gpt4 key购买 nike

在我的 OpenGLES 2 应用程序中(在 Android 2.3 上的 SGX535 上,没关系),我有一个大纹理,我需要经常对其进行小更新。我将其设置为一对 FBO,在其中我将更新渲染到后缓冲区,然后将整个后缓冲区作为纹理渲染到前缓冲区以“交换”它们。然后在场景中的其他地方使用前缓冲区作为纹理。

更新有时是纯色子矩形,但大多数时候,更新是原始图像数据,与纹理格式相同,例如,新图像数据以 RGB565 的形式出现,帧缓冲区对象由 RGB565 支持纹理。

正如您所料,使用 glTexSubImage2D() 很慢,尤其是在像 SGX 这样的延迟渲染器上。不仅如此,在背面 FBO 上使用 glTexSubImage2D 最终会导致应用程序在 SGX 驱动程序的某个地方崩溃。

我尝试为每个子矩形创建新的纹理对象,调用 glTexImage2D 来初始化它们,然后将它们作为纹理四边形渲染到后台缓冲区。在删除它们之前,我为两个 FBO 缓冲区交换保留了纹理对象,但显然这还不够长,因为当纹理 ID 被重新使用时,它们保留了旧纹理的尺寸。

相反,我目前正在获取原始图像数据的整个缓冲区并将其转换为顶点和颜色结构的数组,如下所示:

struct rawPoint {
GLfloat x;
GLfloat y;
GLclampf r;
GLclampf g;
GLclampf b;
};

然后我可以使用 GL_POINTS 将此数组渲染到后台缓冲区。对于 RGB565 数据的缓冲区,这意味着分配一个比原始数据大 10 倍的缓冲区,但它实际上比使用 glTexSubImage2D() 更快!

我无法将顶点或颜色保留为其原生无符号短格式,因为 OpenGL ES 2 仅在顶点属性和着色器制服中采用浮点数。我必须将每个像素作为一组单独的坐标提交,因为我没有几何着色器。最后,我不能使用 EGL_KHR_gl_texture_2D_image 扩展,因为我的平台不支持它!

必须有更好的方法来做到这一点!我正在消耗大量的 CPU 周期,只是为了将图像数据转换为浪费的浮点颜色格式,以便 GPU 可以将其转换回最初的格式。

使用 EGL Pbuffers 会更好吗?我对这种前景并不感到兴奋,因为它需要上下文切换,而且我什至不确定它是否会让我直接写入图像缓冲区。

最佳答案

我对图形有点陌生,所以请多加注意。

创建一个与纹理大小相同的 native 缓冲区(请参阅 引用资料)
使用 native 缓冲区创建 EGL 图像

eglCreateImageKHR(eglGetCurrentDisplay(), 
eglGetCurrentContext(),
EGL_GL_TEXTURE_2D_KHR,
buffer,
attr);

我知道这使用 EGL_GL_TEXTURE_2D_KHR。你确定你的平台不支持这个吗?我也在使用 SGX535 的平台上进行开发,我的似乎支持它。

之后,像往常一样绑定(bind)纹理。我相信,您可以将 memcpy 放入您的 native 缓冲区以非常快速地更新子矩形。

我意识到我正在回答一个月前的问题,但是如果您需要查看更多代码或其他内容,请告诉我。

关于opengl-es-2.0 - 如何将图像数据的子矩形上传到 OpenGLES 2 帧缓冲区纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7232290/

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