3D物体相遇的边缘和毛刺不均匀

时间:2013-11-19 21:17:32

标签: java android opengl-es 3d libgdx

我试图将基于平铺的游戏转换为3D游戏,直接进入我的第一个3D游戏。我正在使用libGDX的新3D类来实现这一目标。

在这种情况下,图块地图中的每个块都将转换为3D对象,我将每个图块渲染为一个框。它工作得相当好,但是我得到的图形错误是盒子共享边缘或角落。

这似乎在桌面项目上效果更好(有时似乎会发生但不那么严重):

Desktop Rendering

但不是在Android设备上: Android Rendering

这种故障取决于屏幕上绘制块的位置。这种情况发生在几种不同的Android设备上,但在屏幕分辨率较高的设备上会更明显。

以下是我用于在主libGDX项目中呈现它的代码:

    @Override
public void create() {      
    modelBatch = new ModelBatch();
    instances = new ArrayList<ModelInstance>();

    //Setup camera
    cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    cam.position.set(0, 0, 150f);
    cam.lookAt(0, 0,0);
    cam.near = 0.1f;
    cam.far = 500f;
    cam.update();

    //Setup Lighting
    environment = new Environment();
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
    environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));

    // Add boxes
    addBox(new Vector3(-50,0,0));
    addBox(new Vector3(-50,16,0));
    addBox(new Vector3(-50,32,0));
    addBox(new Vector3(-50,48,0));

    addBox(new Vector3(50,48,0));
    addBox(new Vector3(66,48,0));
    addBox(new Vector3(82,48,0));
    addBox(new Vector3(98,48,0));

}

private void addBox(Vector3 position){
    ModelBuilder modelBuilder = new ModelBuilder();
    Model model = modelBuilder.createBox(16f, 16f, 16f, 
            new Material(ColorAttribute.createDiffuse(Color.GREEN)),
            Usage.Position | Usage.Normal);
    ModelInstance mis = new ModelInstance(model);
    mis.transform.setTranslation(position);
    instances.add(mis);
}


@Override
public void render() {      
    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

//          The next two lines seem to improve the problem. Problem is almost totally gone
//          I tweaked the values in glPolygonOffset to make it work better
            Gdx.gl20.glEnable(Gdx.gl20.GL_POLYGON_OFFSET_FILL);
            Gdx.gl20.glPolygonOffset(0.1f,0.1f);

//          These make it worse!
//              Gdx.gl.glEnable(Gdx.gl20.GL_DEPTH_TEST);
//              Gdx.gl20.glDepthFunc(Gdx.gl20.GL_LEQUAL); // GL_LESS is default


    modelBatch.begin(cam);

    for(ModelInstance mi : instances)
        modelBatch.render(mi,environment);

    modelBatch.end();
}

有什么想法吗?

编辑:

在更改render()方法后渲染手机(放大,边缘减少): Android Rendering after

1 个答案:

答案 0 :(得分:3)

当两个对象在完全相同的深度重叠时出现的问题称为“拼接”。

您可以使用polygon depth offset来避免它。它基本上为绘制的多边形增加了一些额外的深度。您可能必须为要渲染的每个对象使用不同的值,这可能会重叠。

Gdx.gl.glEnable(Gdx.gl10.GL_POLYGON_OFFSET_FILL);
Gdx.gl10.glPolygonOffset(1.0f, 1.0f);

有时调整深度功能也可能有所帮助。我们想调整它以在深度等于之前渲染的深度时渲染多边形。

Gdx.gl.glEnable(Gdx.gl10.GL_DEPTH_TEST);
Gdx.gl10.glDepthFunc(GL10.GL_LEQUAL); // GL_LESS is default