我正在使用 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/