【问题标题】:Get OpenGL max texture size获取 OpenGL 最大纹理大小
【发布时间】:2014-11-17 20:14:56
【问题描述】:

我正在开发一个可以广泛使用位图的 Android 应用,并且我正在寻找一种可靠的方法来获得不同设备上 OpenGL 的最大纹理大小。
我知道最小尺寸 = 2048x2048,但这还不够好,因为已经有平板电脑具有更高的分辨率(例如 2560x1600)
那么有没有可靠的方法来获取这些信息?

到目前为止,我已经尝试过:

  • Canvas.getMaximumBitmapWidth()(返回 32766,而不是 2048)
  • GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE ...)(返回 0)

我正在使用 minimum-sdk = 15 (ICS),我正在华硕 Transformer TF700t Infinity 上对其进行测试

有没有人知道另一种获取方式? 还是我必须编译一个已知 GPU 的列表以及它们的最大画布大小?

【问题讨论】:

  • 当你调用glGetIntegerv()时你有一个有效的gl上下文吗?

标签: android opengl-es


【解决方案1】:

尝试使用此代码

int[] maxTextureSize = new int[1];
GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);

maxTextureSize 存储解码图像的大小限制,例如 4096x4096、8192x8192 。记得在 MainThread 中运行这段代码,否则你会得到零。

【讨论】:

  • 即使你在MainThread,你也可以想出E/libEGL: call to OpenGL ES API with no current context (logged once per thread),得到结果0。
  • “MainThread”可能恰好是 OpenGL 线程,但不一定是。基本上在用于分配纹理的同一线程中调用它,它应该可以工作。
【解决方案2】:

这将为您提供允许的最大高度。

Canvas canvas = new Canvas();
canvas.getMaximumBitmapHeight() / 8

【讨论】:

  • 但仅当您处于正在绘制的视图中时。否则你会得到一个常数值。
  • 为什么要除以 8? (有效,但我很好奇)
  • 这不是真的。软件渲染画布上的getMaximumBitmap(Height|Width)() 返回constant value,而硬件加速画布返回real GL_MAX_TEXTURE_SIZE。我已经在几台设备上对其进行了测试。除以 8 纯属巧合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 2013-12-09
相关资源
最近更新 更多