加载并将Android Bitmap作为OpenGL纹理翻转时,避免加倍内存?

时间:2015-12-23 05:36:15

标签: android opengl-es

在Android上加载OpenGL纹理数据时,为了应对Android和OpenGL之间坐标系统的差异,我看到的典型模式是在上传之前翻转Bitmap:

Bitmap original = BitmapFactory.decodeStream(...);
Matrix flip = new Matrix();
flip.postScale(1f, -1f);
Bitmap toUpload = Bitmap.createBitmap(original, ..., flip, true);
original.recyle();

不幸的是,在短暂的时间内,这些位图所需的内存增加了一倍,因为原始版本和翻转版本都是驻留版本。这对于非常大的图像(例如纹理图集)来说是有问题的。

有没有一种聪明的方法来避免这种倍增?例如,在原地操纵原件,或在一个步骤中加载和转换?当然,我总是可以操纵源数据(即预翻转图像)或纹理映射(即反转V坐标),但我更倾向于在图像加载期间解决这个问题,作为分离问题的一种方式。 / p>

1 个答案:

答案 0 :(得分:1)

作为一个极端的例子,使用移动VR时,图像和视频源内容通常采用任意格式,具体取决于生成它的工具。

VR内容太大,以至于转换图像像素(如翻转)是不实际的。将变换插入GL管道效率要高得多。

正如您所说,转换3D对象的顶点和UV映射并不能保持良好的关注分离,但它是解决图像格式问题的最佳方法。是的,将自定义转换插入管道可能会很难看。

当然,如果您有选项,可以在编辑器中预先转换图像,特别是针对您的应用,以保持您的管道干净整洁。