Проблемы с отображением прозрачных текстур с OpenGL ES на Android - PullRequest
2 голосов
/ 30 декабря 2010

Я потратил больше одного дня на поиски решения для визуализации прозрачных текстур с помощью OpenGL на Android.Очевидно, что другим повезло больше, чем мне, но после того, как я попробовал различные решения (например, Прозрачная текстура в OpenGL ES для Android ), я все еще не могу это сделать.

Вот мои основные настройки:

        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glClearColor(0.0f, 0.0f, 0.0f, 1);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glDisable(GL10.GL_DITHER);
    gl.glDisable(GL10.GL_LIGHTING);

    gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
            GL10.GL_MODULATE);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glViewport(0, 0, w, h);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluOrtho2D(gl, -ratio, ratio, -1, 1);

Текстуры загружаются через ...

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
            GL10.GL_NEAREST);
    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);

... и есть подсказки, что это приводит к проблемам из-за предварительно умноженного альфа.Но ReplicaIsland также использует функцию GLUtils, и у игры, похоже, нет проблем с прозрачными изображениями.

Теперь, если я рисую текстуры с альфа-каналом (PNG), они кажутся сплошными черными.Текстуры без альфа отображаются правильно в соответствующем цвете).Я применил различные вызовы glBlendFunc без удачи, то есть

    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.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

В результате всегда текстуры вообще не видны (полностью прозрачны?).

Изображения для тестирования используются из проекта ReplicaIsland, это стандартные PNG.Это также означает, что используемые текстуры соответствуют правилу степени 2 - еще одно решение, предлагаемое в различных публикациях.Я вижу одно отличие, которое заключается в том, что ReplicaIsland, по-видимому, в основном полагается на расширение draw_texture, тогда как мне приходится использовать VBO (чтобы иметь возможность применять повороты).

Помощь будет принята с благодарностью!Спасибо Бен

1 Ответ

2 голосов
/ 31 декабря 2010

Хорошо, прошел еще один день отладки, и, наконец, я нашел свою ошибку.Это не имеет ничего общего с цветовой схемой растрового изображения, glBlendFunc или чем-то вроде этого.

Я оказался небрежным использованием GL_FIXED и GL_FLOAT в двух вызовах функций текстуры.

...