我如何为 OpenGL ES 2.0 on board (Android) 创建和 mipmap 压缩纹理?

How can I create and mipmap compressed textures for OpenGL ES 2.0 on board (Android)?

我正在阅读 openGL ES 2.0 指南,我偶然发现了 GenerateMipmap(target) 命令的注释:

If the level zero array is stored in a compressed internal format, the error INVALID_OPERATION is generated.

我的理解是,在 openGL ES 2.0 中没有自动为压缩纹理生成 mipmap 的功能 - 我看过的所有其他内容似乎都表明了这一点,尽管我从未具体见过它在任何地方确认。我已经看到 Mali 纹理压缩工具可以自动生成 mipmaps - 但它只适用于 Windows、Linux 和 OS X - 而不适用于 Android。我需要我的应用程序来压缩纹理并对它们进行 mipmap(想法是用户可以拍摄图像并将其作为纹理应用 - 我已经处理了纹理必须具有 2 的宽度和高度的方面^n 和 2^m)。 ETC1Util 负责压缩纹理(虽然它只处理 ETC1 格式,我仍在寻找具有 alpha 通道的纹理的解决方案 - 但这是另一天的不同问题,如果 Google对我没有帮助)。

我的问题是:如何在运行时 Android 上压缩和映射纹理 - 最重要的是 ETC1,但理想情况下还有 PVRTC、ATITC、S3TC 和 ETC2?

OpenGL 或 OpenGLES 中没有用于生成压缩纹理的内容。

通常,创建压缩纹理很慢,而且人们几乎总是离线生成它们。对于运行时生成的纹理,人们通常将它们保留为 8888、565 或 4444 等基本格式,因为压缩时间与渲染效率之间的权衡是不值得的。

也就是说,可以找到用于生成大多数压缩格式的开源代码,并且没有什么能阻止您将该代码插入到您的游戏代码中。对于 ETC1,有 this (github version). For S3TC (aka DXT) there's squish(或许多其他)。