Остановить рендеринг граней LibGDX внутри объектов - PullRequest
0 голосов
/ 09 февраля 2019

Таким образом, по умолчанию libgdx отображает обе стороны лица.Когда вы создаете куб, используя сетку (предоставляя вершины и индексы), он рендерит грани внутри куба (тратит время рендеринга).

Я хочу остановить это, потому что он тратит время рендеринга, когда у меня есть х количествоВокселы на экране.

Я пробовал отбирать лицо, но оно полностью сломано.Удаляет стороны и все.

Вот мой код:

public void setup() {
String vertexShader = "attribute vec4 a_position;    \n" + "attribute vec4 a_color;\n" + "attribute vec2 a_texCoord0;\n" + "uniform mat4 u_projTrans;\n" + "varying vec4 v_color;" + "varying vec2 v_texCoords;" + "void main()                  \n" + "{                            \n" + "   v_color = vec4(1, 1, 1, 1); \n" + "   v_texCoords = a_texCoord0; \n" + "   gl_Position =  u_projTrans * a_position;  \n" + "}                            \n";
    String fragmentShader = "#ifdef GL_ES\n" + "precision mediump float;\n" + "#endif\n" + "varying vec4 v_color;\n" + "varying vec2 v_texCoords;\n" + "uniform sampler2D u_texture;\n" + "void main()                                  \n" + "{                                            \n" + "  gl_FragColor = v_color * texture2D(u_texture, v_texCoords);\n" + "}";

    shader = new ShaderProgram(vertexShader, fragmentShader);

    float[] vertices = { -0.5f, 0.5f, -0.5f, 0, 0, -0.5f, -0.5f, -0.5f, 0, 1, 0.5f, -0.5f, -0.5f, 1, 1, 0.5f, 0.5f, -0.5f, 1, 0, -0.5f, 0.5f, 0.5f, 0, 0, -0.5f, -0.5f, 0.5f, 0, 1, 0.5f, -0.5f, 0.5f, 1, 1, 0.5f, 0.5f, 0.5f, 1, 0, 0.5f, 0.5f, -0.5f, 0, 0, 0.5f, -0.5f, -0.5f, 0, 1, 0.5f, -0.5f, 0.5f, 1, 1, 0.5f, 0.5f, 0.5f, 1, 0, -0.5f, 0.5f, -0.5f, 0, 0, -0.5f, -0.5f, -0.5f, 0, 1, -0.5f, -0.5f, 0.5f, 1, 1, -0.5f, 0.5f, 0.5f, 1, 0, -0.5f, 0.5f, 0.5f, 0, 0, -0.5f, 0.5f, -0.5f, 0, 1, 0.5f, 0.5f, -0.5f, 1, 1, 0.5f, 0.5f, 0.5f, 1, 0, -0.5f, -0.5f, 0.5f, 0, 0, -0.5f, -0.5f, -0.5f, 0, 1, 0.5f, -0.5f, -0.5f, 1, 1, 0.5f, -0.5f, 0.5f, 1, 0

    };

    short[] indices = { 0, 1, 3, 3, 1, 2, 4, 5, 7, 7, 5, 6, 8, 9, 11, 11, 9, 10, 12, 13, 15, 15, 13, 14, 16, 17, 19, 19, 17, 18, 20, 21, 23, 23, 21, 22

    };

    texture = new Texture("texture.png");

    Gdx.input.setCursorCatched(false);

    mesh = new Mesh(true, vertices.length / 3, indices.length, VertexAttribute.Position(), VertexAttribute.TexCoords(0));
    mesh.setVertices(vertices);
    mesh.setIndices(indices);

    GL40.glEnable(GL40.GL_DEPTH_TEST);
    //GL40.glEnable(GL40.GL_CULL_FACE);
    //GL40.glCullFace(GL40.GL_BACK);
}

public void render() {
    Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

    cameraController.update();

    texture.bind();
    shader.begin();
    shader.setUniformMatrix("u_projTrans", camera.combined);
    shader.setUniformi("u_texture", 0);
    mesh.render(shader, GL46.GL_TRIANGLES);
    shader.end();
}

1 Ответ

0 голосов
/ 10 февраля 2019

Когда Face Culling включен, тогда примитивы отбрасываются, в зависимости от порядка намотки координат вершин, как видно с точки зрения.Для этого определяется порядок намотки лицевых поверхностей: glFrontFace.По умолчанию это против часовой стрелки.Если разрешено скалирование задних граней:

GL40.glEnable(GL40.GL_CULL_FACE);
GL40.glCullFace(GL40.GL_BACK);

, то полигоны с противоположным порядком намотки (по часовой стрелке) отбрасываются.

В соответствии с вашими координатами вершины

float[] vertices = { 
    -0.5f,  0.5f, -0.5f, 0, 0, 
    -0.5f, -0.5f, -0.5f, 0, 1,
     0.5f, -0.5f, -0.5f, 1, 1,
     0.5f,  0.5f, -0.5f, 1, 0,

    -0.5f,  0.5f,  0.5f, 0, 0,
    -0.5f, -0.5f,  0.5f, 0, 1,
     0.5f, -0.5f,  0.5f, 1, 1,
     0.5f,  0.5f,  0.5f, 1, 0,

     0.5f,  0.5f, -0.5f, 0, 0,
     0.5f, -0.5f, -0.5f, 0, 1,
     0.5f, -0.5f,  0.5f, 1, 1,
     0.5f,  0.5f,  0.5f, 1, 0,

    -0.5f,  0.5f, -0.5f, 0, 0,
    -0.5f, -0.5f, -0.5f, 0, 1,
    -0.5f, -0.5f,  0.5f, 1, 1,
    -0.5f,  0.5f,  0.5f, 1, 0,

    -0.5f,  0.5f,  0.5f, 0, 0,
    -0.5f,  0.5f, -0.5f, 0, 1,
     0.5f,  0.5f, -0.5f, 1, 1,
     0.5f,  0.5f,  0.5f, 1, 0,

    -0.5f, -0.5f,  0.5f, 0, 0,
    -0.5f, -0.5f, -0.5f, 0, 1,
     0.5f, -0.5f, -0.5f, 1, 1,
     0.5f, -0.5f,  0.5f, 1, 0
};

и индексы

short[] indices = {
     0,  1,  3,  3,  1,  2,
     4,  5,  7,  7,  5,  6,
     8,  9, 11, 11,  9, 10,
    12, 13, 15, 15, 13, 14,
    16, 17, 19, 19, 17, 18,
    20, 21, 23, 23, 21, 22
};

Это означает, что 1-й, 3-й и 5-й ряд индексов имеют неправильный порядок намотки.Это должно быть:

short[] indices = {
     0,  3,  1,  3,  2,  1,
     4,  5,  7,  7,  5,  6,
     8, 11,  9, 11,  10, 9,
    12, 13, 15, 15, 13, 14,
    16, 19, 17, 19, 18, 17,
    20, 21, 23, 23, 21, 22
};
...