我需要一些帮助来查找如何在Android中使用纹理压缩的信息(或示例)。我现在有很多PNG,我需要减少它们占用的内存量。我在研究PVR压缩,但我不知道如何在OpenGL中使用它。
有人能为我指明正确的方向吗?或者提供一些例子,因为我什么都找不到。
Android上主要支持四种纹理压缩类型:
- ETC1(Ericsson纹理压缩)。所有安卓手机都支持这种格式。但是,它不支持alpha通道,因此只能用于不透明纹理
- PVRTC(PowerVR纹理压缩)。支持带有PowerVR GPU的设备(Nexus S、Kindle fire等)
- ATITC(ATI纹理压缩)。用于高通公司的Adreno GPU设备(Nexus One等)
- S3TC(S3纹理压缩)。这种纹理压缩用于NVIDIA芯片组集成设备(Motorola Xoom等)
这里和这里有更详细的信息。
简而言之,如果你的纹理没有alpha,你可以使用ETC1。如果它们确实有alpha,并且您希望支持所有设备,则必须将纹理压缩为其他三种类型,并根据设备加载它们。
如何使用:
-
压缩您的png文件(您可以根据纹理类型使用ETC Pack、PVRTexTool、ATI Compressonator、Nvidia Texure Tools等工具)并添加到您的项目资产中。
-
如果您没有使用ETC1:,请确定设备中有哪些扩展可用
public void onSurfaceCreated(GL10 gl, EGLConfig config) { String s = gl.glGetString(GL10.GL_EXTENSIONS); if (s.contains("GL_IMG_texture_compression_pvrtc")){ //Use PVR compressed textures }else if (s.contains("GL_AMD_compressed_ATC_texture") || s.contains("GL_ATI_texture_compression_atitc")){ //Load ATI Textures }else if (s.contains("GL_OES_texture_compression_S3TC") || s.contains("GL_EXT_texture_compression_s3tc")){ //Use DTX Textures }else{ //Handle no texture compression founded. } }
-
将压缩纹理作为原始数据加载。
-
使用glCompressedTexImage2D而不是glTexImage2D:
public void onDrawFrame(GL10 gl) { .... gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, level, internalformat, width, height, border, imageSize, data); }
这是一个ol线程,所以我想用上的可用信息更新它http://devtools.ericsson.com/etcETC2在Khronos标准OpenGL ES 3.0和OpenGL 4.3中是强制性的。
您不应该在Android上只使用PVR压缩,因为这不适用于所有型号。为了避免这种情况,您应该只使用ETC1(在所有GLES 2.0设备上强制要求使用),或者为单独的GPU模式提供单独的纹理包。android开发指南有一个助手类来加载压缩格式。
你可以使用etcpack进行压缩。
请注意,使用ETC1不会获得alpha通道-您可以通过将alpha通道作为一个单独的纹理来实现一些奇特的片段着色技巧。
我只是想指出etc1并不是所有安卓设备都支持的,这与gergonzalez所说的相反
注意:大多数安卓设备都支持ETC1格式,但不能保证它可用。要检查设备上是否支持ETC1格式,请调用ETC1Til.isTEC1Supported()方法。
https://developer.android.com/guide/topics/graphics/opengl.html#textures