Цветовые полосы 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 очень близок к настольной версии.