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

标签 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。

关于这个主题的文档或示例似乎很少。

提前致谢。

最佳答案

无需深入细节(因为这将编写一个可能在某个地方的库..),至少您需要从文件中解析 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/

相关文章:

JavaFX 子级编辑无需外部 css 文件

android - Flutter开发(flutter-dev)›需要紧急帮助…由于gradle问题,我无法在android设备中运行flutter应用,并且无法构建apk

java - 如何在较旧的 API 版本中将进度条放在按钮前面?

java - 如何从Android中的另一个 Activity 调用MapActivity的方法?

java - 如何在不使变量最终化的情况下访问线程外的变量

java - 如何在 Kotlin 中使用 Double Epsilon/Precision 调用 assertEquals?

java - ArrayList<String> 到 toString()

java - 解析 android :background ="@android:drawable/alert_dark_frame" 时 Robolectric InflateException

android - 如何使用改造处理 JSON 数组对象?

android - 我们如何在 Assets 文件夹中的sqlite中升级数据库