2015-02-11 4 views
0

Я только что обнаружил действительно странную проблему с моим приложением.Android OpenGL ES 2.0 Текстуры не работают в некоторых размерах

Эта проблема возникает, когда она запускается на моем телефоне.

Я нагружал растровый (для использования в качестве Open GL Texture) следующим образом:

tiles = BitmapFactory.decodeResource(view.getResources(), R.drawable.tilespic, BMFOptions); 

BMFOptions устанавливает следующую строку:

BMFOptions.inPreferredConfig = Bitmap.Config.RGB_565; 

Когда я запустил мое приложение, какой произошло изначально, что текстура появилась как просто черный квадрат. Итак, я попробовал это на другом устройстве (планшете), и он работал отлично.

Я знаю, что если битмап имеет альфа-канал, BitmapFactory будет просто загружать его как ARGB_8888, если битмап.Config.RGB_565 указан, и я подтвердил это с помощью других растровых изображений (путем вызова getConfig). Это растровое изображение делает есть Alpha.

Однако, когда я вызываю getConfig, он возвращает null (только если RGB_565 указан и только на этом растровом/текстуре - на этом устройстве).

То, что я пытался

Если установить его в ARGB_8888 или просто опустить BMFOptions для этого растрового изображения, то все отображается правильно.

Если я установил его в ARGB_4444 (только для тестирования), то он отображает, но текстуры кривые/под углом (опять же это растровое изображение/текстура).

Итак, я сделал изменение размера оригинального растрового изображения (оригинальный размер - 100 x 909).

Я изменил его размер до 505 x 201, 506 x 201 и множество других размеров, и он все еще не работает (обратите внимание, что это спрайт-листы, поэтому эти размеры - это только то, как они были разработаны).

Я затем изменил его размер до 506 x 204 и его сделал работа. Затем я попробовал его в 1880 х 921, и он снова работал.

Я не использую текстуры NPOT и никогда не сталкивался с проблемой, помните, что у меня также есть другие текстуры с нечетными размерами, такие как 1880 x 921 и 1000 x 885, и они прекрасно себя ведут на этом телефоне (но, очевидно, их пиксельные данные/компоновка различны).

Поскольку у этого растрового изображения есть альфа (что мне нужно), я просто удаляю BMFOptions для этого конкретного растрового изображения и позволяю ему загружать его как ARGB_8888, однако я хотел бы знать любые возможные причины этого нечетного поведения.

Если это помогает, это код, я использую, чтобы загрузить свои текстуры ....

public static int LoadTexture(GLSurfaceView view, Bitmap imgTex){ 

     int textures[] = new int[1]; 
     try { 

      GLES20.glGenTextures(1, textures, 0); 
      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]); 
      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 
      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 

      GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, imgTex, 0); 

      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE); 
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE); 

     } catch (Exception e){ 
      } 
     textureCount++;  
     return textures[0]; 
    } 

ответ

0

Некоторые телефоны могут использовать только текстуры с мощностью 2-х размеров.
например 256x256, 512x512, 1024x128 будет работать
300x300, 512x100 и т. Д. Не будет работать.

Это требование стандарта OpenGL ES 2.0 (afaik 3.0 расслабляет это).Некоторые телефоны будут работать с текстурами non-pow-of-2, но это не обязательно. Приклеивание к текстурам из двух текстур - это безопасный способ пойти, если вы хотите настроить максимальное количество телефонов.

Если это не проблема, посмотрите, есть ли у вас какие-либо GLErrors.
Также я только заметил: вы используете GL10.GL_TEXTURE_2D, в то время как в других строках вы используете GLES20. *. Я просмотрел его, и GL_TEXTURE_2D определяется как 3553 в обоих местах, но все равно будет выглядеть лучше, если вы также использовали GLES20.

+1

Привет @ user2962184, я уверен, что это не совсем точно, OpenGL ES 2.0 * делает * напрямую поддерживает текстуры NPOT (пока используется режим обертывания кромки и поддержка mipmap). Поэтому * все * устройства, работающие с 2.x, могут использовать текстуры NPOT, поскольку они являются частью спецификации Open GL ES 2.0. Это устройства с 1.x, которые могут или не могут использовать текстуры NPOT в зависимости от того, имеют ли они правильное расширение. - Я думаю, что это правильно :-) – Zippy

Смежные вопросы