获取OpenGL最大纹理尺寸

7
我正在开发一款Android应用程序,将大量使用位图,并正在寻找一种可靠的方式来获取不同设备上OpenGL的最大纹理大小。
我知道最小尺寸=2048x2048,但这已经不够好了,因为已经有分辨率更高的平板电脑出现了(例如2560x1600)
那么,有一种可靠的方法来获取此信息吗?

到目前为止,我尝试过:
  • Canvas.getMaximumBitmapWidth()(返回32766,而不是2048)
  • GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE ...)(返回0)
我使用的最低SDK为15(ICS),正在Asus Transformer TF700t Infinity上测试它
有没有人知道另一种获取它的方法?或者我需要编译已知GPU的列表以及它们的最大画布大小?

1
当您调用glGetIntegerv()时,您是否拥有有效的GL上下文? - derhass
2个回答

6

尝试使用以下代码

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

maxTextureSize 存储解码图像的大小限制,例如 4096x4096、8192x8192。请记得在主线程中运行此代码,否则将获得零值。


2
即使您在主线程中,也可能会出现“E/libEGL:调用没有当前上下文的OpenGL ES API(每个线程仅记录一次)”,并获得结果0。 - Weekend
1
“MainThread” 可能是 OpenGL 线程,但不一定是。基本上在分配纹理时使用相同的线程调用它,它应该可以工作。 - Rupert Rawnsley

0
这将会给你允许的最大高度。
Canvas canvas = new Canvas();
canvas.getMaximumBitmapHeight() / 8

但仅当您处于正在绘制的视图中时才会返回该值,否则您将得到一个常量值。 - Francesco Donzello
1
为什么你必须除以8?(虽然它有效,但我很好奇) - AndroidRuntimeException
4
在软件渲染画布上调用getMaximumBitmap(Height|Width)()并不正确,该函数返回的是恒定值,而硬件加速画布返回的是真实的GL_MAX_TEXTURE_SIZE。我已在几个设备上进行了测试。除以8只是一个纯粹的巧合,没有实际意义。 - Weekend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接