Я, похоже, не получаю, чтобы мое смешивание правильно работало в OpenGL ES 2 на Android. У меня есть текстуры с альфа-каналами, которые я хочу показать с соответствующей альфой. Смешивание появляется как добавка, даже когда верхний рисованный объект имеет альфа 1.0. В моем шейдере фрагмента я жестко закодировал значение 1.0 для альфы и понял, что он использует цвет, а не alpha значения.Android OpenGL ES 2 - Смешивание кажется всегда аддитивным
Например, это выглядит следующим образом:
Вместо этого:
Я рисую в правильном порядке, в этом примере синий должен быть полностью непрозрачным поверх серого квадрата. Я попробовал несколько режимов смешивания (один, один), (альфа, альфа) и т. Д., Несколько порядков тиражирования и использование и не используя проверку глубины. Я пробовал случайные режимы смешивания, которые дают неверные результаты, поэтому смешение меняется, когда я его устанавливаю.
Я считаю, проблема в том, что opengl смешивает аддитивный цвет. (Alpha, Alpha) имеет смысл для меня, и когда я явно устанавливаю alpha в 1.0 в шейдере, я думаю, что я получу квадрат (фактическая форма, на которую проецируется текстура), на которой есть синий круг. Это не случается, что меня озадачивает, я думаю, что я недостаточно понимаю функцию смешения sfactor и dfactor.
Спасибо, человек! проблема в том, что 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
WebGL имеет эту же «проблему», хотя в случае с WebGL это поведение [четко определено] (http://www.khronos.org/registry/webgl/specs/latest/1.0/#2.4) в спецификации. –