0

最近我一直在尝试学习如何使用 Box2D 灯。我已经尝试将它们实现到我的一个简单游戏中。一切正常并且看起来不错(在 PC 上),直到我在手机上运行它。灯光看起来完全不同,我什至不知道如何描述它。看起来我正在经历某种粘液,而不是良好和平滑的灯光效果。我注意到的另一件事是,当我尝试用 OBS 录制它时,它看起来和我的手机上的一样。我在我兄弟的手机上试过了,令我惊讶的是,它看起来和我的电脑上一模一样。如果有人遇到过这种行为或者可能知道它可能是由什么引起的,我将不胜感激,即使是如何称呼它的名字。改变光线的数量似乎没有多大作用。我也尝试在兄弟的手机上录制它,但它的行为方式与 PC 录制的方式相同。

我的手机(小米mi mix 3)

我哥的手机(华为P10 lite)

它在我的手机上的外观: https ://youtu.be/fq_J6A95D2Y

这是它在 PC 上的外观屏幕,光线的“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 并且“输出线看起来仍然相同”)。关闭柔软度不会改变与我的问题相关的任何内容。


    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 绘制完所有内容之后调用的。

4

1 回答 1

0

你所描述的是所谓的带状。出于某种原因,Android 上的 LibGDX 默认帧缓冲区仅使用 16 位颜色。您可以在 AndroidLauncher 中将其更改为 32 位:

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

您还可以启用抖动以减少条带,但可能会影响性能。对于它的价值,我总是保持它,我所有的东西都以 60fps 运行,所以我认为它需要一个相当沉重的游戏才能成为问题。

要启用抖动,请将其放入游戏的create()方法中:

Gdx.gl.glEnable(GL20.GL_DITHER);
于 2019-09-28T14:24:57.367 回答