2011-09-19 50 views
0

我期待在android中加载压缩的jpg和png文件。加载原始文件太慢了。计划是提前将文件压缩成DXT文件。我试图使用DXTViewer来压缩一些图像并尝试将它们加载为纹理。在Android中使用Java加载DXT纹理文件

目前我正在从gl.glCompressedTexImage2D(...)获取GL_INVALID_ENUM。

这是代码。

InputStream is = ESGLTextureUtility.loadFile(iFile, assetManager); 
    ByteBuffer bb = this.readToByteBuffer(is); 
    textureInfo.source = iFile; 
    is.close(); 

    this.checkError(gl); 

    gl.glGenTextures(1, textureInfo.textures, 0); 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureInfo.textures[0]); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 

    gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, 512, 512, 0, (int) this.total, bb); 

就像我说的,这将触发一个GL_INVALID_ENUM。

似乎很少有关于此主题的文档或示例。

在此先感谢。

回答

1

没有进入详细的细节(因为这将写一个库,可能在那里..),至少你需要解析文件中的DDS头,确定格式,并使用正确的格式代码上传。所以,如果你发现DXT1,上传应该是这样的:

gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, 0, 0x83F1, 512, 512, 
          0, (int) this.total, bb); 

的DXT格式不规范GLES1的一部分,所以你需要使用十六进制代码,或做一些常量他们。我使用了上面的DXT1格式代码。我的猜测是使用RGBA给出了invalid_enum错误。

另请注意,如果您的代码想要支持加载mipmap,立方体贴图,这是解析,加载和上传中的一些进一步工作。

最后,您应该通过查看s3tc扩展的GL扩展字符串来确保设备具有s3tc/DXT支持。

-d