Я потратил больше одного дня на поиски решения для визуализации прозрачных текстур с помощью 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 (чтобы иметь возможность применять повороты).
Помощь будет принята с благодарностью!Спасибо Бен