使用Java在android中加载DXT纹理文件

时间:2011-09-19 21:49:52

标签: java android

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

目前我从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 个答案:

答案 0 :(得分:1)

没有详细介绍(因为那会编写一个可能在那里的库...),至少你需要从文件中解析DDS头,确定格式,并使用正确的格式代码上传。因此,如果您检测到DXT1,您的上传应该如下所示:

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

DXT格式不是GLES1规范的一部分,因此您需要使用十六进制代码,或为它们制作一些常量。我使用上面的DXT1格式代码。我的猜测是使用RGBA会产生invalid_enum错误。

另请注意,如果您的代码想要支持加载mipmaps,cubemaps,那么在解析,加载和上传方面需要进一步的努力。

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

-d