2010-12-29 2 views
2

Я сейчас инвестировал более дня, чтобы найти решение о том, как визуализировать прозрачные текстуры с помощью OpenGL на Android. Очевидно, что у других было больше удачи, чем у меня, но после того, как я попробовал различные решения (например, Transparent texture in OpenGL ES for 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. Это также означает, что используемые текстуры соответствуют правилу power-of-2 - другое решение, предлагаемое в разных сообщениях. Я вижу одно отличие, которое заключается в том, что ReplicaIsland, как правило, полагается на расширение draw_texture, тогда как я должен использовать VBOs (чтобы иметь возможность применять вращения).

Справка была бы принята с благодарностью! Thanks Ben

ответ

2

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

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