0

我正在开发这个照片应用程序,它使用带有渲染器的 OpenGL 2.0、屏幕外 GLSurfaceView 和一些着色器脚本(*.fsh 和 *.vsh)。

在从 Assets 文件夹加载着色器脚本、准备 GL 表面和上下文等之后,我们最终调用GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);它,它工作得非常好,它会生成带有效果的位图。

当然,问题在于内存限制和任何足够大的位图(无论设备如何,对于旧 Gingerbread 和 Nexus 10 的非常大的图像都不是那么大),它会产生 OutOfMemoryException。

我对 OpenGL 不是很了解,我知道处理大量数据的方法是使用流,因此没有必要将其全部保存在内存中。

所以问题是,有没有办法通过 Stream 而不是内存中的 Bitmap 应用 openGl 着色器/渲染器?如果是,任何指向链接或基本过程的指针?

4

1 回答 1

1

不完全确定您的意思,Stream但这是另一种解决方案。将渲染拆分为多个通道。例如,如果您有 512x512 纹理和对应的四边形纹理,但由于内存限制只能上传 256x256,请执行以下操作:

  • 将纹理分成 4 个块
  • 创建一个合适的纹理对象
  • 对于每个块
    • 将当前块上传到 tex 对象数据存储中
    • 绘制四边形的 1/4,例如左上角和相应的纹理

请注意,上面的示例假定纹理和屏幕尺寸为 512x512。无论如何,我想你明白了。

显然,这是通常的内存/性能权衡。您可以通过使用更多带宽进行传输并进行更多渲染来规避内存限制。

注意:我是桌面 GL 人,我不太确定 GPU 和其他部分之间的内存是如何分配的,或者是否有一些专用的 VRAM。我假设您的 GL 资源数量有限,甚至比整个系统内存还小。

于 2013-09-26T10:26:32.323 回答