Почему glDrawElements () ничего не рисует? - PullRequest
1 голос
/ 12 февраля 2020

Я видел пару вопросов об одной и той же топике c, но все еще не мог понять, что не так с моим кодом.

Это сработало, чтобы запустить окно, в котором нажатие клавиши измените цвет фона с помощью glClearColor().

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

Как создается mesh:

public Mesh(Vertex[] verts, int[] indices) {
    this.verts = verts;
    this.indices = indices;
}

//Differend class
public Mesh mesh = new Mesh(new Vertex[] {
        new Vertex(new Vector3f(-0.5f,  0.5f, 0.0f)),
        new Vertex(new Vector3f(-0.5f, -0.5f, 0.0f)),
        new Vertex(new Vector3f( 0.5f, -0.5f, 0.0f)),
        new Vertex(new Vector3f( 0.5f,  0.5f, 0.0f))
    }, new int[] {
        0, 1, 2,
        0, 3, 2
    });

Для инициализации игры это называется:

public void create() {
    vao = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(vao);

    FloatBuffer positionBuffer = MemoryUtil.memAllocFloat(verts.length * 3);
    float[] positionData = new float[verts.length * 3];
    for (int i = 0; i < verts.length; i++) {
        positionData[i * 3] = verts[i].getPosition().getX();
        positionData[i * 3 + 1] = verts[i].getPosition().getY();
        positionData[i * 3 + 2] = verts[i].getPosition().getZ();
    }

    positionBuffer.put(positionData).flip();

    pbo = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, pbo);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, positionBuffer, GL15.GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

    IntBuffer indexBuffer = MemoryUtil.memAllocInt(indices.length * 3);
    indexBuffer.put(indices).flip();

    ibo = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ibo);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indexBuffer, GL15.GL_STATIC_DRAW);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
}

И, наконец, mesh должен отображаться следующим образом:

public void renderMesh(Mesh mesh) {
    clear();

    GL30.glBindVertexArray(mesh.getVAO());
    GL30.glEnableVertexAttribArray(0);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, mesh.getIBO());
    GL11.glDrawElements(GL11.GL_TRIANGLES, mesh.getIndices().length, GL11.GL_FLOAT, 0);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
    GL30.glDisableVertexAttribArray(0);
    GL30.glBindVertexArray(0);
}

Я проверил, что методы действительно вызываются с помощью System.out.println. Вклад игры все еще работает. Просто экран черный и на нем нет четвёрки. Почему он ничего не рисует на экране?

1 Ответ

1 голос
/ 12 февраля 2020

Аргумент типа, который установлен на glDrawElements hs, чтобы соответствовать буферу индекса, а не буферу вершин.
В вашем случае это должно быть GL_UNSIGNED_INT, а не GL_FLOAT. См. glDrawElements.

GL11.glDrawElements(GL11.GL_TRIANGLES, mesh.getIndices().length, GL11.GL_FLOAT, 0);

GL11.glDrawElements(GL11.GL_TRIANGLES, mesh.getIndices().length, GL11.GL_UNSIGNED_INT, 0);

Примечание. GL_FLOAT не является допустимым значением для glDrawElements и приведет к ошибке INVALID_ENUM.

...