2013-11-02 4 views
2

Я, похоже, не получаю, чтобы мое смешивание правильно работало в OpenGL ES 2 на Android. У меня есть текстуры с альфа-каналами, которые я хочу показать с соответствующей альфой. Смешивание появляется как добавка, даже когда верхний рисованный объект имеет альфа 1.0. В моем шейдере фрагмента я жестко закодировал значение 1.0 для альфы и понял, что он использует цвет, а не alpha значения.Android OpenGL ES 2 - Смешивание кажется всегда аддитивным

Например, это выглядит следующим образом: enter image description here

Вместо этого: enter image description here

Я рисую в правильном порядке, в этом примере синий должен быть полностью непрозрачным поверх серого квадрата. Я попробовал несколько режимов смешивания (один, один), (альфа, альфа) и т. Д., Несколько порядков тиражирования и использование и не используя проверку глубины. Я пробовал случайные режимы смешивания, которые дают неверные результаты, поэтому смешение меняется, когда я его устанавливаю.

Я считаю, проблема в том, что opengl смешивает аддитивный цвет. (Alpha, Alpha) имеет смысл для меня, и когда я явно устанавливаю alpha в 1.0 в шейдере, я думаю, что я получу квадрат (фактическая форма, на которую проецируется текстура), на которой есть синий круг. Это не случается, что меня озадачивает, я думаю, что я недостаточно понимаю функцию смешения sfactor и dfactor.

ответ

3

Вы используете Android Bitmap для загрузки текстур?

Использование GLUtils.texImage2D() для загрузки альфа-текстур из растрового изображения на Android нарушено. Это проблема, которую Google действительно должен документировать лучше. Проблема заключается в том, что класс Bitmap преобразует все изображения в предварительно умноженный формат, но это не работает с OpenGL ES, если изображение полностью непрозрачно.

В этой статье приводится более подробная информация об этом click here.

+0

Спасибо, человек! проблема в том, что GLUtils.texImage2D() автоматически использует предварительно умноженные растровые изображения (и по какой-то причине Android не включает исправление?), как вы сказали. Рабочим решением для меня было скопировать код из сообщения № 3 здесь: [link] (https://groups.google.com/forum/#!topic/android-developers/uqbDPmP4L8o) и использовать \t \t GLES20.glBlendFunc (GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); – user1055947

+0

WebGL имеет эту же «проблему», хотя в случае с WebGL это поведение [четко определено] (http://www.khronos.org/registry/webgl/specs/latest/1.0/#2.4) в спецификации. –

Смежные вопросы