【问题标题】:Load huge texture in parts in OpenGL ES 2.0在 OpenGL ES 2.0 中加载零件中的巨大纹理
【发布时间】:2018-05-25 01:57:29
【问题描述】:

我想在 OpenGL ES 2.0 中将 巨大的位图作为纹理加载到 Android 上的显卡内存中,以用作尽可能大的纹理图集。我的设备的最大纹理尺寸为 8192x8192。

我知道我可以通过以下方式将位图加载为纹理:

// create bitmap
Bitmap bitmap = Bitmap.createBitmap(8192, 8192, Bitmap.Config.ARGB_8888);
{ // draw something
    Canvas c = new Canvas(bitmap);
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
    p.setColor(0xFFFF0000);
    c.drawCircle(4096, 4096, 4096, p);
}
// load as a texture
GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmap, 0);

但是,(毫不奇怪)我在尝试创建这种大小的位图时收到 java.lang.OutOfMemoryError

是否可以分段加载?由于它是一个纹理图集,它可以由较小的位图组装而成。我查看了texSubImage2D 函数,但我不明白你会在哪里初始化全尺寸纹理,或者事先提供全尺寸纹理的大小。

【问题讨论】:

    标签: android opengl-es textures opengl-es-2.0 android-bitmap


    【解决方案1】:

    在 GL 方面,您需要分配完整的存储空间,然后对其进行修补。

    使用glTexImage2D() 分配存储,data 参数的值为null。使用glTexSubImage2D()上传补丁。

    请注意,这仍然需要 256MB 内存,因此在许多预算设备上,您仍然会得到 OOM ...

    【讨论】:

    • 谢谢你,这行得通!我将在答案中发布我的工作代码。 “256MB内存”是指显卡的内存,对吧?因此,如果我在那里的内存不足,我会从 OpenGL 得到一个错误。对吗?
    • 在 Android 上,您通常不会拥有带有专用内存的“显卡”——移动 GPU 使用与 CPU 相同的系统 RAM。但是,是的,如果失败,您将收到 GL 错误。
    • 哦,我还没有意识到这一点。但这仍然要好得多,因为在 Java 中用于在堆上分配新 Bitmap 的内存预算要小得多。
    【解决方案2】:

    根据solidpixel 的回答,这是一个可以完成这项工作的代码:

    GLES20.glTexImage2D ( GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 8192, 8192, 0,
            GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
    
    Bitmap bitmap = Bitmap.createBitmap(1024, 1024, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(bitmap);
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
    for (int i = 0; i < 8; ++i) {
        for (int j = 0; j < 8; ++j) {
            // clear the bitmap
            c.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
            { // draw something
                p.setARGB(255, 32 * i, 32 * j, 255 - 32 * j);
                c.drawCircle(512, 512, 512, p);
            }
            // load as part of a texture
            GLUtils.texSubImage2D(GL_TEXTURE_2D, 0, i * 1024, j * 1024, bitmap);
        }
    }
    

    这里的纹理由 64 个 1024x1024 大小的位图组合而成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2012-04-08
      相关资源
      最近更新 更多