我希望在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。
关于此主题的文档或示例似乎很少。
提前致谢。
答案 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