HW ускоренная активность - как получить ограничение размера текстуры OpenGL?
Я пытаюсь включить ускорение hw в Honeycomb и отображать некоторые растровые изображения на холсте.
Все работает нормально, но для больших растровых изображений ( > 2048 в одном измерении) я получаю ошибку в журнале:
OpenGLRenderer: битмап слишком большой, чтобы быть загруженным в текстуру
Я знаю, что это связано с ограничением hw и может обойти его, уменьшив максимальный размер растрового изображения, который будет отображаться, если включено ускорение hw (проверка по View.isHardwareAccelerated()).
Мой вопрос: как легко определить максимальный размер текстуры, доступный для чертежа Bitmap с помощью аппаратного обеспечения.
2048, кажется, является лимитом для моего устройства, но он может быть другим для разных.
Изменить: я не создаю приложение OpenGL, просто обычное приложение, которое может использовать ускорение hw. Таким образом, я вообще не знаком с OpenGL, я просто вижу ошибку, связанную с OpenGL в журнале, и пытаюсь ее решить.
Ответы
Ответ 1
В настоящее время минимальный предел равен 2048px (т.е. поддержка должна поддерживать текстуры не менее 2048x2048.) В ICS мы представим новый API в классе Canvas, который предоставит вам эту информацию:
Canvas.getMaximumBitmapWidth()
и Canvas.getMaximumBitmapHeight()
.
Ответ 2
Другим способом получения максимального разрешенного размера будет цикл всех конфигураций EGL10 и отслеживание наибольшего размера.
public static int getMaxTextureSize() {
// Safe minimum default size
final int IMAGE_MAX_BITMAP_DIMENSION = 2048;
// Get EGL Display
EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
// Initialise
int[] version = new int[2];
egl.eglInitialize(display, version);
// Query total number of configurations
int[] totalConfigurations = new int[1];
egl.eglGetConfigs(display, null, 0, totalConfigurations);
// Query actual list configurations
EGLConfig[] configurationsList = new EGLConfig[totalConfigurations[0]];
egl.eglGetConfigs(display, configurationsList, totalConfigurations[0], totalConfigurations);
int[] textureSize = new int[1];
int maximumTextureSize = 0;
// Iterate through all the configurations to located the maximum texture size
for (int i = 0; i < totalConfigurations[0]; i++) {
// Only need to check for width since opengl textures are always squared
egl.eglGetConfigAttrib(display, configurationsList[i], EGL10.EGL_MAX_PBUFFER_WIDTH, textureSize);
// Keep track of the maximum texture size
if (maximumTextureSize < textureSize[0])
maximumTextureSize = textureSize[0];
}
// Release
egl.eglTerminate(display);
// Return largest texture size found, or default
return Math.max(maximumTextureSize, IMAGE_MAX_BITMAP_DIMENSION);
}
Из моего тестирования это довольно надёжно и не требует создания экземпляра.
По производительности, это заняло 18 миллисекунд, чтобы выполнить на моей заметке 2 и только 4 миллисекунды на моем G3.
Ответ 3
Если вы хотите динамически узнать ограничение размера текстуры вашего устройства (потому что оно изменяется в зависимости от устройства), вы должны вызвать этот метод:
int[] maxTextureSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
И не забывайте, что для некоторого устройства (например, Nexus One) размер текстуры должен быть равен 2!
Я знаю, что мой ответ наступает после последнего обновления этой темы... извините
Ответ 4
Согласно спецификации, вызов glGetIntegerv
с помощью GL_MAX_TEXTURE_SIZE
.
Параметр GL_MAX_TEXTURE_SIZE возвращает одно значение. Значение дает приблизительную оценку самой большой текстуры, которую может обрабатывать GL. Значение должно быть не менее 64.
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml