当加载和翻转Android位图为OpenGL纹理时,避免内存翻倍



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

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

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

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

作为一个极端的例子,使用移动VR时,图像和视频源内容通常是某种任意格式,这取决于使用什么工具来制作。

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

正如你所说,变换三维对象的顶点和UV映射并不能保持良好的清晰分离,但它是解决图像格式问题的最佳方法。是的,将自定义转换插入到管道中可能会变得很难看。

当然,如果你有选择,可以在编辑器中对图像进行预转换,特别是针对你的应用程序,以保持你的管道美观干净。

最新更新