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