Libgdx Box2D Огни, выглядят по-разному на устройствах Android, странные контуры света - PullRequest
0 голосов
/ 28 сентября 2019

Недавно я пытался научиться использовать подсветку Box2D.Я попытался реализовать их в одной из моих простых игр.Все работало и выглядело хорошо (на ПК), пока я не запустил его на своем телефоне.Огни выглядят совершенно иначе, и я даже не знаю, как это описать.Вместо хороших и плавных световых эффектов похоже, что я двигаюсь через какую-то слизь.Еще одна вещь, которую я заметил, это то, что когда я пытаюсь записать его с помощью OBS, он выглядит так же, как на моем телефоне.Я попробовал это на телефоне моего брата, и, к моему удивлению, он выглядит точно так же, как на моем компьютере.Если кто-то сталкивался с таким поведением или может знать, чем оно может быть вызвано, я был бы признателен даже за то, как его назвать.Изменение количества лучей, похоже, мало что дает.Я тоже пытался записать это на телефон брата, но он ведет себя так же, как запись на ПК.

Мой телефон (Xiaomi mi mix 3)

Телефон моего брата (Huawei P10 lite)

Как это выглядит на моем телефоне: https://youtu.be/fq_J6A95D2Y

Вот экран того, как это выглядит на ПК, "OutLines" света все еще видны, но гораздо меньше: https://imgur.com/a/D6UHUVp

Вот код, связанный со светом:


    `RayHandler.useDiffuseLight(true);
    rayHandler = new RayHandler(world);
    rayHandler.setAmbientLight(0.1f,0.1f,0.1f,0.2f);
    rayHandler.setCulling(true);`

Без useDiffuseLight это выглядит еще хуже.Отбраковка, по-видимому, не связана с моей проблемой.


    lightArray = new Array<>();
    int rays = 2048;
    int distance = 8;
    Color color = new Color(0.5f,0.5f,0.5f,1);
    PointLight light1 = new PointLight(context.getRayHandler(),rays,color,distance,3,3);
    PointLight light2 = new PointLight(context.getRayHandler(),rays,color,distance,3,13);
    PointLight light3 = new PointLight(context.getRayHandler(),rays,color,distance,6,3);
    PointLight light4 = new PointLight(context.getRayHandler(),rays,color,distance,6,13);
    lightArray.add(light1);
    lightArray.add(light2);
    lightArray.add(light3);
    lightArray.add(light4);
    for(Light light:lightArray){
        light.setSoftnessLength(1);
        light.setSoft(true);

    }

Количество лучей, похоже, не меняет ничего, связанного с моей проблемой.(Я пробовал это с 64,128,1024,4096 и «Линии Out все еще выглядят одинаково»).Отключение мягкости ничего не меняет, связанное с моей проблемой.


    playerLight = new PointLight(context.getRayHandler(),2048,new 
    Color(0.4f,0.4f,0.4f,1f),5,playerBody.getPosition().x,playerBody.getPosition().y);
    playerLight.attachToBody(playerBody);


    rayHandler.setCombinedMatrix(context.getCamera());
    rayHandler.updateAndRender();

Это вызывается после того, как shapeRenderer и SpriteBatch нарисовали все.

1 Ответ

0 голосов
/ 28 сентября 2019

То, что вы описываете, называется бандингом.По какой-то причине в буфере кадров LibGDX по умолчанию на Android используется только 16-битный цвет.Вы можете изменить его на 32-битный, как это в вашем AndroidLauncher:

protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(){{
        r = 8;
        g = 8;
        b = 8;
        a = 8;
    }};
    initialize(new MyGdxGame(), config);
}

Вы также можете включить дизеринг, чтобы уменьшить полосу, но это может повлиять на производительность.Что бы это ни стоило, я всегда держу его, и все мои вещи работают на скорости 60 кадров в секунду, поэтому я думаю, что для того, чтобы это стало проблемой, понадобится довольно тяжелая игра.

Чтобы включить дизеринг, вставьте это в свою игру create() метод:

Gdx.gl.glEnable(GL20.GL_DITHER);
...