我正在寻找在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。
关于这个主题的文档或示例似乎很少。
提前致谢。
最佳答案
无需深入细节(因为这将编写一个可能在某个地方的库..),至少您需要从文件中解析 DDS header ,确定格式并使用正确的格式代码用于上传。因此,如果您检测到 DXT1,您的上传内容应如下所示:
gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, 0, 0x83F1, 512, 512,
0, (int) this.total, bb);
DXT 格式不是 GLES1 规范的一部分,因此您需要使用十六进制代码,或者为它们创建一些常量。我上面使用的是DXT1格式的代码。我的猜测是使用 RGBA 给出了 invalid_enum 错误。
另请注意,如果您的代码想要支持加载 mipmap、cubemap,则需要在解析、加载和上传方面做进一步的工作。
最后,您应该通过在 GL 扩展字符串中查找 s3tc 扩展来确保设备具有 s3tc/DXT 支持。
-d
关于java - 使用Java在android中加载DXT纹理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477710/