android opengl es 1.1动态纹理压缩

android opengl es 1.1动态纹理压缩,android,opengl-es,compression,textures,Android,Opengl Es,Compression,Textures,我必须使用纹理压缩,因为我的应用程序目前正在使用高达100MB的内存进行纹理压缩 我正在从视图创建纹理,因此不可能以压缩格式创建纹理。如何使用ETC1/ATC/PVRTC实时压缩它们并将它们发送到gpu?我试过: GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, ETC1.ETC1_RGB8_OES, bitmap, 0); 我还尝试了手机支持的其他压缩格式,但纹理始终为白色。输入位图是RGB_565,mip贴图被禁用 是否可以将位图作为纹理发送到opengl

我必须使用纹理压缩,因为我的应用程序目前正在使用高达100MB的内存进行纹理压缩

我正在从视图创建纹理,因此不可能以压缩格式创建纹理。如何使用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上一样?

您无法通过opengl es实现这一点-仅支持ETC解压缩。ETC压缩并不是一件简单的事,它可以快速有效地完成—不过,您可以在您的程序中查看并实现etcpack。

在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.compressTexture和ETC1Util.loadTexture,但它们提供了损坏的纹理。好消息是,我用本机内存消耗从100MB降到26MB。但这个解决方案非常缓慢。即使它是在具有最小优先级的单独线程上完成的,渲染线程也会被完全阻塞。有没有更有效的方法?或者我必须在新设备上首次运行时创建这些ETC1纹理,并将其保存到SD卡以供以后重用吗?

其他压缩(ATC/PVRTC)也不可能以这种方式进行?etcpack是针对windows的,我需要它在android设备上运行。因此,唯一的方法是从视图创建纹理,然后使用ETC1Util将其压缩并保存在SD卡上以供以后重用?是的,所有压缩的纹理都是这样,GL中没有内置的压缩支持。您不必将其保存到SD卡。当然,您可以立即上载ETC纹理。将压缩的纹理作为资源与应用程序一起分发,无需在设备上压缩,除非它们是动态生成的。@fabspro它们是根据设备的分辨率和功能动态生成的。幸运的是,只有一次,当应用程序第一次启动时。