【问题标题】:How can I create and mipmap compressed textures for OpenGL ES 2.0 on board (Android)?如何为板载 OpenGL ES 2.0 (Android) 创建和 mipmap 压缩纹理?
【发布时间】:2018-05-15 02:51:32
【问题描述】:

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

如果零级数组以压缩的内部格式存储,则会生成错误 INVALID_OPERATION。

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

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

【问题讨论】:

  • 使用glTexImage2D,可以上传特定MIP-map级别的图像数据。但我怀疑,您的问题更多是关于如何以压缩格式为更高的 MIP 贴图级别创建更小的纹理?
  • 是的,没错。

标签: android opengl-es textures mipmaps


【解决方案1】:

OpenGL 或 OpenGLES 中没有任何东西可用于生成压缩纹理。

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

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

【讨论】:

  • 对于这种情况,慢没关系。这个想法是创建一个对象编辑器,用户可以在其中创建用于游戏中的对象 - 在那里,是否需要一点时间都没关系 - 我可以显示加载消息。我已经查看了您提到的工具,但它们似乎无法自动生成 mipmap 纹理……或者是吗?不过,感谢您提供这些工具的链接 - 您是如何找到它们的?那是我第一次看到它们中的任何一个(我还必须学习如何实现它们,但同样 - 如果我无法弄清楚,那是另一个问题)。
  • 自己做 mipmap 可能最容易,一个盒子过滤器就足够了(通过从上面的 mipmap 中平均 4 个像素来获得像素颜色)。还有其他的 mipmapping 花哨的方法,但是质量提升是微不足道的,而且复杂度要高得多。我通过谷歌搜索(在您的搜索中包含“开源”)和在 github 上搜索找到了它们。
  • 好的,谢谢。实现其他代码,盒子过滤器,......我有很多东西要学;D
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多