Я сейчас инвестировал более дня, чтобы найти решение о том, как визуализировать прозрачные текстуры с помощью 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