Проще всего, если я начну с показа картины проблемы. На снимках показан снимок текстуры, движущейся вокруг.
Приложение на моем HTC Hero:
То же приложение на эмуляторе, где оно работает нормально (не обращая внимания на случайно размещенные остатки, я знаю их причину, и это не проблема):
Теперь, если вы посмотрите на первое изображение, верхнее - это «настоящее», а остальные всегда следуют внизу, а также есть копии выше. В настоящее время я перекрашиваю только фоновые квадраты, которые посетили, и они по какой-то причине нарисованы над копиями (вы можете видеть, что все они частично закрашены плиткой).
Нужно ли перекрашивать весь экран каждый кадр на телефонах Android? Или можно избавиться от этих странных копий?
Вот код, используемый для рисования текстур (я новичок в opengl-es, так что это очень похоже на остров реплик):
первый
public static void beginDrawing(GL10 gl, float viewWidth, float viewHeight) {
gl.glShadeModel(GL10.GL_FLAT);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glOrthof(0.0f, viewWidth, 0.0f, viewHeight, 0.0f, 1.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glEnable(GL10.GL_TEXTURE_2D);
}
Затем для каждой текстуры (сначала я рисую фон, затем в этом случае только одну текстуру Халка. Я уверен, что она рисуется только один раз):
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
((GL11Ext) gl).glDrawTexfOES(x, y, 0, (float) mWidth, (float) mHeight);
и в конце:
public static void endDrawing(GL10 gl) {
gl.glDisable(GL10.GL_BLEND);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glPopMatrix();
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPopMatrix();
}
Код, который я использую для загрузки текстур:
private void loadGLTextures(GL10 gl) {
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
textureID = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
GL10.GL_CLAMP_TO_EDGE);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL10.GL_MODULATE);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
int[] mCropWorkspace = new int[4];
mCropWorkspace[0] = 0;
mCropWorkspace[1] = bitmap.getHeight();
mCropWorkspace[2] = bitmap.getWidth();
mCropWorkspace[3] = -bitmap.getHeight();
((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D,
GL11Ext.GL_TEXTURE_CROP_RECT_OES,
mCropWorkspace,
0);
mCrop = mCropWorkspace;
bitmap.recycle();
}
Вся помощь очень ценится, и, если что-то неясно, оставьте комментарий!
РЕДАКТИРОВАТЬ: я должен добавить, что если я каждый кадр перерисовываю все квадраты, «лишние» изображения скрыты, и это работает так, как должно.