Цветовые полосы libGDX/Box2DLights на Android

Я использую Box2DLights в одном из моих проектов. Я работал над этим проектом уже пару месяцев, и я просто попытался перенести его на Android, чтобы посмотреть, как он выглядит. Хотя эффект освещения выглядит очень хорошо в настольной версии игры, в версии для Android он выглядит ужасно. Световой градиент совсем не плавный, с эффектом цветовой полосы. Вот скриншоты версий для ПК и Android:

Чтобы использовать Box2DLights в моей игре, я использую этот код на своем GameScreen:

RayHandler.useDiffuseLight(true); 
rayHandler = new RayHandler(world); 
rayHandler.resizeFBO(Gdx.graphics.getWidth()/5, Gdx.graphics.getHeight()/5); 
rayHandler.setBlur(true);   
rayHandler.setAmbientLight(new Color(0.15f, 0.15f, 0.15f, 0.1f));

Я также пытался играть с различными параметрами, такими как:

rayHandler.diffuseBlendFunc.set(GL20.GL_DST_COLOR, GL20.GL_SRC_COLOR);

Или же

rayHandler.shadowBlendFunc.set(GL20.GL_DST_COLOR, GL20.GL_SRC_COLOR);

Или же

Gdx.gl.glEnable(GL20.GL_DITHER);

Я не знаю, что это помогает, но вот другие уточнения:

  • Мой набор плиток был сделан в Photoshop и записан в виде файла PNG с режимом RGB, 8 бит / канал
  • Этот эффект наблюдался на моих двух устройствах Android, которые:
    • Планшет Трансформер Prime TF701 с Android 4.2.1
    • LG G Stylo с Android 5.0.2

Спасибо за помощь!

1 ответ

Вот решение:

Проблема была связана с низкой битовой глубиной на Android. Если вы посмотрите на код AndroidApplicationConfiguration.java, вы увидите в строках 30 и 31 этот код:

/** number of bits per color channel **/
public int r = 5, g = 6, b = 5, a = 0;

Таким образом, приложения Android с libGDX по умолчанию отображают младшие битовые изображения. Это можно легко изменить в AndroidLauncher.java вашего приложения.

AndroidLauncher.java по умолчанию вашего приложения выглядит следующим образом:

public class AndroidLauncher extends AndroidApplication {
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        initialize(new MyGdxGame(), config);
    }
}

Все, что вам нужно сделать, чтобы иметь формат рендеринга RGBA8888 для вашего приложения Android, это:

public class AndroidLauncher extends AndroidApplication {
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        config.r = 8;
        config.g = 8;
        config.b = 8;
        config.a = 8;
        initialize(new MyGdxGame(), config);
    }
}

И вуаля! Вот сравнительный скриншот Android RGB565 VS Android RGBA8888 VS Desktop: введите описание изображения здесь

Вы можете видеть, что Android RGBA8888 очень близок к настольной версии.

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