Альфа-смешивание не работает на Android libgdx, но работает на рабочем столе

#java #android #libgdx #opengl-es-2.0 #blending

#java #Android #libgdx #opengl-es-2.0 #смешивание

Вопрос:

У меня странная проблема с альфа-смешиванием в libgdx. Что я делаю, так это рисую фоновое изображение, рисую маску (выполняется с помощью ShapeRenderer), а затем рисую передний план. Маска отлично работает на моем рабочем столе, но не на моих устройствах Android (Galaxy S2, Lenovo IdeaTab A2109). Я действительно понятия не имею, что происходит. Может кто-нибудь мне помочь? Или, по крайней мере, дайте мне подсказку о том, что происходит. Спасибо

Результат на моем рабочем столе: Результат на рабочем столе:

Результат на моем телефоне:

Результат на моем телефоне:

Моя функция рендеринга:

 Gdx.gl.glClearColor(0f, 0f, 0f, 0);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
camera.zoom = 1f;
camera.update();
batch.begin();
drawBackground(batch);
batch.end();

frameBuffer.begin();
line.drawMask(false);
frameBuffer.end();
fboRegion.setTexture(frameBuffer.getColorBufferTexture());

batch.begin();
drawMask(batch);
drawForeground(batch)
batch.end();
  

функции рисования:

  private void drawBackground(SpriteBatch batch){
    batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    page1.draw(batch);
    page2.draw(batch);
    batch.flush();
}

private void drawMask(SpriteBatch batch){
    Gdx.gl.glColorMask(false, false, false, true);

    batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ZERO);
    batch.draw(fboRegion, 0, 0);
    batch.flush();
}

private void drawForeground(SpriteBatch batch){
    Gdx.gl.glColorMask(true, true, true, true);

    batch.setBlendFunction(GL20.GL_DST_ALPHA, GL20.GL_ONE_MINUS_DST_ALPHA);
    page3.draw(batch);
    batch.flush();
}
  

Редактировать: как насчет использования шейдеров вместо альфа-маски? например, замените все белые пиксели из ShapeRenderer пикселями изображения переднего плана. Это хорошая идея?

Комментарии:

1. Можете ли вы показать строку, в которой вы создаете экземпляр FrameBuffer?

2. @Tenfour04 уверен: фреймбуфер = новый фреймбуфер (Pixmap. Формат.RGBA8888, 1280, 768, false);

Ответ №1:

OpenGL ES 2.0 не гарантирует 8888 для цветового буфера кадрового буфера. это будет работать только на некоторых устройствах. Вы должны использовать RGBA4444, RGB565 или RGB5_A1.

Я делаю это, чтобы я мог, по крайней мере, использовать 8888 на устройствах с OpenGL ES 3.0 и на рабочем столе:

 Format format = (Gdx.graphics.getGL30()==null amp;amp; 
    Gdx.app.getType()!=ApplicationType.Desktop) ?
        Format.RGB565 : Format.RGBA8888;
  

Комментарии:

1. Я пробовал RGBA4444, и это не сработало. Я также попробовал RGB565, но я не вижу, сработало бы это в первую очередь, потому что мне нужен альфа-канал. что такое RGB5_A1? Я не могу найти его в стандартном формате libgdx.