#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.