Угроза текстуры Android opengl

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

Android 4.1 reference rendering

Изображение выше - это эталонный рендеринг, созданный эмулятором под управлением Android 4.1 Jelly Bean, все выглядит так, как должно быть.

Android 1.6

Второе изображение снимается в эмуляторе под управлением Android 1.6. Обратите внимание на повреждение некоторых отключенных кнопок панели инструментов (они отображаются с цветом 1f, 1f, 1f, 0.5f)

Android 1.6

Третье изображение записывается в том же эмуляторе. Разница в том, что теперь оценка отображается в верхнем правом углу. Оценка - это растровый шрифт, а текстура - альфа-маска. Все, что было сделано после оценки, теряет текстуру. Обратите внимание, что предыдущий скриншот также содержал растровый шрифт, сделанный таким же образом (но с использованием другой текстуры).

Аналогичная проблема возникла на одном из устройств Samsung (я не помню модель). Когда текстура пола была визуализирована, все отображалось после этой утраченной текстуры. Проблема не проявилась, когда я либо а) не связывал текстуру; б) связал текстуру, но не использовал треугольники, используя ее. C) воссоздал объект png с нуля.

Настройки открытия:

gl.glDisable(GL10.GL_LIGHTING);
gl.glDisable(GL10.GL_CULL_FACE);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glDisable(GL10.GL_DITHER);
gl.glDepthMask(false);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBlendFunc(GL10.GL_ONE,GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glShadeModel(GL10.GL_FLAT);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);

Как загружаются текстуры:

public void doGLLoading(Engine renderer) {
        GL10 gl=renderer.getGl();
        int[] ids=new int[1];
        gl.glGenTextures(1, ids,0);
        id=ids[0];
        gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
        Log.d("SpriteDraw", String.format("Texture %s has format %s",getPath(),bitmap.getConfig().toString()));
        buildMipmap(gl, bitmap);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T, textureWrapT);
    }
private void buildMipmap(GL10 gl, Bitmap bitmap) {
    int level = 0;
    int height = bitmap.getHeight();
    int width = bitmap.getWidth();

    while (height >= 1 || width >= 1) {
        // First of all, generate the texture from our bitmap and set it to
        // the according level
                    //TextureUtils.texImage2D(gl, GL10.GL_TEXTURE_2D, level, -1, bitmap, -1, 0);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0);
        if (height == 1 || width == 1) {
            break;
        }
        // Increase the mipmap level
        level++;
        height /= 2;
        width /= 2;
        Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height,
                true);

        // Clean up
        bitmap.recycle();
        bitmap = bitmap2;
    }
}

Примечания: шрифт отображается с помощью gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); и GL10.glDrawArrays. Коррупция влияет не только на эмулятор 1.6, но и на серию 2.x android, хотя это не так заметно (альфа-маски все еще отображаются неправильно). Все ресурсы правильно загружаются как мощность двух растровых изображений.

Ответ 1

  • Я предлагаю использовать 32-битные текстуры, а не оттенки серого, а не "альфа-маски" (что это?)
  • Проверьте размер вашей текстуры, он не должен превышать максимальный размер (glGetInteger (GL_MAX_TEXTURE_SIZE). Также сделайте shure, что ваши текстуры имеют мощность 2. Да, вы упомянули раньше, чем они есть, но если они находятся в масштабируемых активах (папки drawable_x_dpi), они будут масштабироваться андроидом. Чтобы избежать масштабирования, поместите их в "сырую" папку.
  • Только для теста попытайтесь отключить всю фильтрацию, включая mipmaps - установите GL_TEXTURE_WRAP_S и GL_TEXTURE_WRAP_T в GL_NEAREST