类似于重叠多边形面的伪像

时间:2014-06-17 16:35:23

标签: opengl libgdx

我在场景中有很多立方体。所有这些立方体总共有6个边。一些立方体彼此相邻。问题显示如下图所示。出现奇怪的瑕疵,似乎有重叠的三角形。我试过改变反击,但无济于事。但这并不是主要问题,如图所示,底部立方体上没有顶部立方体,但仍然在顶部显示工件。

enter image description here

如果我缩放顶点的位置,问题就会大大消失。

State.glClearDepthf(1);
Gdx.graphics.getGL20().glEnable(GL_DEPTH_TEST);
Gdx.graphics.getGL20().glDisable(GL_BLEND);
State.glDepthMask(true);
Gdx.graphics.getGL20().glColorMask(true, true, true, true);
Gdx.graphics.getGL20().glClearColor(0, 1, 0, 0);
Gdx.graphics.getGL20().glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Gdx.graphics.getGL20().glColorMask(true, true, true, true);
Gdx.graphics.getGL20().glDepthFunc(GL_LEQUAL);
Gdx.graphics.getGL20().glEnable(GL_CULL_FACE);
Gdx.graphics.getGL20().glCullFace(GL_BACK);
blockShader.begin();
terrain.getTexture().bind(0);
blockShader.setUniformMatrix("worldTrans", transform);
blockShader.setUniformf("cameraPos", camera.position);
blockShader.setUniformMatrix("projTrans", camera.combined);
terrain.render(blockShader);
blockShader.end();

我正在为我的立方体使用以下顶点。我将x,y,z位置(它是一个整数)适当地添加到每个顶点浮点数。我已经检查过自己这些顶点都是CW对齐的。

static float[] CUBE = {
        0f,0f,0f, // triangle 1 : begin
        0f,0f, 1f,
        0f, 1f, 1f, // triangle 1 : end

        1f, 1f,0f, // triangle 2 : begin
        0f,0f,0f,
        0f, 1f,0f, // triangle 2 : end

        1f,0f, 1f,
        0f,0f,0f,
        1f,0f,0f,

        1f, 1f,0f,
        1f,0f,0f,
        0f,0f,0f,

        0f,0f,0f,
        0f, 1f, 1f,
        0f, 1f,0f,

        1f,0f, 1f,
        0f,0f, 1f,
        0f,0f,0f,

        0f, 1f, 1f,
        0f, 0f, 1f,
        1f,0f, 1f,

        1f, 1f, 1f,
        1f,0f,0f,
        1f, 1f,0f,

        1f,0f,0f,
        1f, 1f, 1f,
        1f,0f, 1f,

        1f, 1f, 1f,
        1f, 1f,0f,
        0f, 1f,0f,

        1f, 1f, 1f,
        0f, 1f,0f,
        0f, 1f, 1f,

        1f, 1f, 1f,
        0f, 1f, 1f,
        1f,0f, 1f
};

我正在使用LibGDX。任何帮助将不胜感激。

编辑:

以下我用来创建多个多维数据集:

    float[] spawn = new float[CUBE.length];

    System.arraycopy( CUBE, 0, spawn, 0, CUBE.length );

    for (int i = 0; i < spawn.length; i+=3) {
        spawn[i] += x * 1.01f;
        spawn[i+1] += y * 1.01f;
        spawn[i+2] += z * 1.01f;
    }

    vertices.put(spawn);

注意 1.01f。如果我添加它,问题就会消失。 enter image description here

如果我删除 1.01f ,则第一张图片适用于问题清晰显示的位置。这似乎是重复的顶点,但我找不到它们。还值得注意;如果我将CUBE数组 1.f&#39; 更改为 0.9f&#39; 我会认为问题会在很大程度上消失,但事实并非如此

编辑:

我的近1f远远是100f。所以问题也不存在。

编辑:

我犯了一个至关重要的错误,这肯定是。它发生在着色器中。

vec3 color = mod(v_vertex, 1.0) * 16.0;

用于计算颜色,因为我没有法线,紫外线或颜色。但是,我的很多顶点都定位在1.0(或倍数)。有时显然mod会导致略小于1,有时则会为0。

这是我的修复之一:

vec3 color = mod(v_vertex + 0.01, 1.0) * 16.0;

现在顶部将是1.01并且mod回到0.01,这已经更好了。但是我希望颜色为0.0 - 1.0而不是环绕。如果有人能够回答这个问题,我会得到最终答案。

2 个答案:

答案 0 :(得分:1)

怎么样:

vec4 mod = mod(v_vertex,1.0);
gl_FragColor = mod + 0.999*(1-step(0.001, mod));

这会将任何四舍五入到多于一的东西(这样mod将它减少到几乎为零)并且增加足够的值以使其靠近一个。

答案 1 :(得分:0)

我最终使立方体的范围从0.0001f到0.999f而不是0f和1f,这解决了所有问题。