android - GL 最大纹理尺寸策略

标签 android opengl-es-2.0 andengine

我正在使用 AndEngine 开发游戏。由于我是针对 Android 进行此操作,并且希望在不牺牲纹理质量的情况下覆盖尽可能多的设备,因此我有 2 种纹理包类型:HD 和 LOW:

  • 高清纹理 = 2048x2048
  • 低纹理= 1024x1024
  • 高清摄像头 = 800x1280
  • 低摄像头 = 400x640

我已经完成了设置高清纹理包或低纹理包的所有逻辑,我现在需要的是一个好的策略来选择应用程序启动时使用的女巫。

使用 AndEngine 的:

GLState state = new GLState();
int max = state.getInteger(GLES20.GL_MAX_...);

我发现了一些值(value)观:

型号:三星 Note 8、索尼 XPERIA U
GL_MAX_TEXTURE_SIZE:4096
GL_MAX_TEXTURE_IMAGE_UNITS:8
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:8

型号:三星 Galaxy Mini、三星 S3 Mini、HTC One S
GL_MAX_TEXTURE_SIZE:4096
GL_MAX_TEXTURE_IMAGE_UNITS:16
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:20

型号:三星 S4、Nexus4、XPERIA Z1
GL_MAX_TEXTURE_SIZE:4096
GL_MAX_TEXTURE_IMAGE_UNITS:16
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:32

在此openGL Docs我可以找到每个常量的含义,但我在这里有点迷失,我不知道如何使用这些数据来为我的纹理和相机选择正确的设置。

我需要你的帮助和提示,我走的路正确吗?接下来我应该如何处理此信息?
感谢您抽出时间。

最佳答案

GL_MAX_TEXTURE_SIZE 是您的硬件支持的最大方形纹理尺寸。

  • 任何纹理的 X 和 Y 尺寸都不能超过此尺寸。

GL_MAX_TEXTURE_IMAGE_UNITS 指的是您可以在可编程管道中绑定(bind)和使用的最大纹理数量(例如,GLSL 程序中唯一采样器统一名称)(GL_MAX_TEXTURE_UNITS 是 GLES 1.0 中的固定功能模拟)。

  • 在 GLES 2.0 中,该值的最小值为 2。

GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 指的是您可以在 GLSL 程序中的所有着色器中使用的纹理数量。

  • fragment 着色器中的 4 个采样器 + 顶点着色器中的 4 个采样器 = 8 个组合纹理图像单元


注意:OpenGL ES 2.0 不需要顶点着色器中的纹理查找支持,我怀疑 Samsung Note 8、Sony XPERIA U 有不支持此功能的实现,根据组合 TMU 计数与一般 TMU 计数之间的奇偶性。

  • 查询 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 的值可以结束任何猜测。


不过,为了回答您的实际问题...您可以用来确定要使用哪个纹理包的这些值中唯一的一个是GL_MAX_TEXTURE_SIZE。没有可以查询的 OpenGL 参数来确定底层硬件的内存容量/纹理填充率,而这是您在选择纹理包时真正想知道的。您需要通过其他方式收集这些信息,可能是小型基准测试或已知硬件的数据库,或者如果幸运的话,该平台有一个单独的 API 可以让您查询此信息。

关于android - GL 最大纹理尺寸策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19380635/

相关文章:

java - 如何禁用布局对齐?

android - 使用GLES20的Vertex Buffer Objects(VBO)在Android 2.3.3上不起作用

java - 如何编译 AndEngine 源代码?

android - cocos2d 与 andengine 等距游戏?

android - 如何旋转 Sprite 并 move

android - 如何使用 Mediarecorder 捕获像 instagram 和 vine 这样的视频广场

android - 带有自定义 header 的自定义 ListView Android

opengl - 仅使用 EGLSurface 在多个表面上绘图?

android - Firebase/android 如何获取子键和值?

opengl-es-2.0 - 哪些 OpenGL ES 2.0 纹理格式可进行颜色、深度或模板渲染?