LibGDX/OpenGL - проблема прозрачности glReadPixels

У меня проблема с glReadPixels/ScreenUtils.getFrameBufferPixmap(), где полупрозрачные спрайты, нарисованные поверх непрозрачных, кажется, "перезаписывают" прозрачность, что приводит к беспорядку.

Черные спрайты с прозрачностью 10% нарисованы поверх плиток в виде теней.

Оригинальное (внутриигровое) изображение:

Нормальные тени

Изображение, полученное с помощью glReadPixels в ScreenUtils.getFrameBufferPixmap (...):

(тени белые, потому что они слегка прозрачны)

Как сделать так, чтобы альфа-смешивание работало правильно в getFrameBufferPixmap()?

1 ответ

Вам нужно использовать glBlendFuncSeparate вместо glBlendFunc, который использует SpriteBatch. SpriteBatch предоставляет заднюю дверь (недокументированную, я думаю, по некоторым причинам) для использования glBlendFuncSeparate, Установите для параметров функции смешивания значение -1, а затем вы можете вручную установить свой собственный glBlendFuncSeparate это всегда оставляет альфа вашего кадрового буфера как 1.0:

spriteBatch.setBlendFunction(-1, -1);
Gdx.gl.glBlendFuncSeparate(
    GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ZERO, GL20.GL_ONE);
//...
spriteBatch.begin();
//...
spriteBatch.end();

Также убедитесь, что альфа вашего glClearColor является 1.0f,

Другие вопросы по тегам