Android OpenGL ES 1.1 实时纹理压缩

3

我的应用目前使用了多达100MB的纹理,因此我需要使用纹理压缩技术。

我正在从视图中创建纹理,但它们无法以压缩格式创建。请问如何在ETC1/ATC/PVRTC上实时压缩它们并将其发送到GPU?我已尝试:

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, ETC1.ETC1_RGB8_OES, bitmap, 0);

我尝试了我手机支持的其他压缩格式,但纹理始终是白色的。输入位图是RGB_565格式的,mip-maps已禁用。
在安卓平台上,能否像在PC上一样发送位图作为纹理到OpenGL ES 1.1中,以实现自动压缩?
2个回答

4

在 Arne Bergene Fossaa 的帮助下,我得到了以下解决方案:

int size = m_TexBitmap.getRowBytes() * m_TexBitmap.getHeight();
ByteBuffer bb = ByteBuffer.allocateDirect(size); // size is good
bb.order(ByteOrder.nativeOrder());
m_TexBitmap.copyPixelsToBuffer(bb);
bb.position(0);

ETC1Texture etc1tex;
// RGB_565 is 2 bytes per pixel
//ETC1Texture etc1tex = ETC1Util.compressTexture(bb, m_TexWidth, m_TexHeight, 2, 2*m_TexWidth);

final int encodedImageSize = ETC1.getEncodedDataSize(m_TexWidth, m_TexHeight);
ByteBuffer compressedImage = ByteBuffer.allocateDirect(encodedImageSize).order(ByteOrder.nativeOrder());
// RGB_565 is 2 bytes per pixel
ETC1.encodeImage(bb, m_TexWidth, m_TexHeight, 2, 2*m_TexWidth, compressedImage);
etc1tex = new ETC1Texture(m_TexWidth, m_TexHeight, compressedImage);

//ETC1Util.loadTexture(GL10.GL_TEXTURE_2D, 0, 0, GL10.GL_RGB, GL10.GL_UNSIGNED_SHORT_5_6_5, etc1tex);
gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, 0, ETC1.ETC1_RGB8_OES, m_TexWidth, m_TexHeight, 0, etc1tex.getData().capacity(), etc1tex.getData());

bb = null;
compressedImage = null;
etc1tex = null;

我知道ETC1Util.compressTextureETC1Util.loadTexture,但是它们提供的纹理损坏了。好消息是,使用本地内存消耗从100MB降到了26MB。但这种解决方案速度非常慢。即使它在一个独立的线程上以最低优先级运行,渲染线程也完全被阻塞。有更有效的方法吗?还是我必须在新设备上第一次运行时创建这些ETC1纹理,并将其保存到SD卡以供以后重用?


将压缩的纹理作为应用程序资源分发,除非它们是动态生成的,否则无需在设备上进行压缩。 - fabspro
1
@fabspro它们是根据设备的分辨率和功能动态生成的。幸运的是,这只会发生一次,即应用程序第一次启动时。 - shelll

1

你无法通过OpenGL ES来实现这个 - 只支持ETC解压缩。ETC压缩并不是真正容易快速且好的 - 你可以看看http://devtools.ericsson.com/etc并在你的程序中实现etcpack。


其他压缩方式(ATC/PVRTC)也不能用这种方法吗?ETCPACK是为Windows设计的,而我需要在Android设备上运行它。所以唯一的方法是从View创建纹理,然后使用ETC1Util进行压缩并将其保存在SD卡上以供以后重用? - shelll
是的,对于所有压缩纹理都是这种情况,在GL中没有内置支持来压缩它们。当然,您不必将其保存到SD卡中,可以一次上传ETC纹理。 - Arne Bergene Fossaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接