android opengl es 1.1动态纹理压缩

问题描述:

我必须使用纹理压缩,因为我的应用程序目前最多使用100MB的纹理。android opengl es 1.1动态纹理压缩

我从视图创建纹理,所以它们不可能以压缩格式创建。我怎么能在ETC1/ATC/PVRTC上动态压缩它们并将它们发送到GPU?我试过了:

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

我也试过了我的手机支持的其他压缩格式,但纹理总是白色的。输入位图是RGB_565,并且禁用了mip贴图。

是否可以将位图作为纹理发送到opengl es 1.1,以便在android上自动压缩,就像可以在pc上一样?

与阿恩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卡中以备后用?

+0

将应用程序的压缩纹理作为资源进行分发,除了动态生成外,无需在设备上压缩它们。 – fabspro

+1

@fabspro它们是根据设备的分辨率和功能动态生成的。幸运的是只有一次,当应用程序第一次启动。 – shelll

你不能通过OpenGL ES来完成 - 只支持ETC解压缩。 ETC压缩对于快速和良好并不是微不足道的 - 你可能会看看http://devtools.ericsson.com/etc并在你的程序中实现etcpack。

+0

其他按压(ATC/PVRTC)也不可能以这种方式? etcpack是为Windows而我需要它在Android设备上运行。所以唯一的办法是从View创建纹理,然后用ETC1Util压缩并保存在SD卡上以备后用。 – shelll

+0

是的,所有压缩纹理都是这种情况,GL中没有内置支持来压缩它们。当然,您不必将其保存到SD卡,您可以立即上传ETC纹理。 –