Глубина не отображается, а отображается наложение - PullRequest
0 голосов
/ 27 сентября 2018

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

public void create(float[] vertices, int[] indices, int numberOfVertices, int numberOfIndices) {
        indexCount = numberOfIndices;
        vao = gl.genVertexArrays(); 
        gl.bindVertexArray(vao);

        IntBuffer indicesBuffer = factory.create(indices);
        ibo = gl.genBuffers();
        gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
        gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_STATIC_DRAW);

        FloatBuffer verticesBuffer = factory.create(vertices);
        vbo = gl.genBuffers();
        gl.bindBuffer(GL_ARRAY_BUFFER, vbo);
        gl.bufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);

        gl.vertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
        gl.enableVertexAttribArray(0);

        gl.bindBuffer(GL_ARRAY_BUFFER, 0);          
        gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        gl.bindVertexArray(0);
    }

Я создаю свой объект сетки со следующим кодом, в котором вершины и индексы определены как:

private void createTriangles() {
    float[] vertices = new float[] { 
            //x     y      z
           -1.0f, -1.0f, 0.0f, //0
            0.0f,  0.0f, 1.0f, //1
            1.0f, -1.0f, 0.0f, //2
            0.0f,  1.0f, 0.0f  //3
    };

    int[] indices = new int[] {
        0, 3, 1,
        1, 3, 2, 
        2, 3, 0,
        0, 1, 2
    };
    mesh.create(vertices, indices, 12, 12);
}

Чтобы отобразить их на экране, я вызываю функцию рендеринга из игрового цикла.который определяется как.

public void render() {
    gl.bindVertexArray(vao);
    gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    gl.drawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
    gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    gl.bindVertexArray(0);
}

Для создания моих FloatBuffer и IntBuffer у меня есть фабричный класс, определенный как.

public class BufferFactory {
    public IntBuffer create(int[] indices) {
        IntBuffer buffer = BufferUtils.createIntBuffer(indices.length);
        buffer.put(indices);
        buffer.flip();
        return buffer;
    }

    public FloatBuffer create(float[] vertices) {
        FloatBuffer buffer = BufferUtils.createFloatBuffer(vertices.length);
        buffer.put(vertices);
        buffer.flip();
        return buffer;
    }

}

Так что проблема, которую я получаю, заключается в том, что она должна была нарисоватьчетыре треугольника на экране, чтобы сформировать пирамиду, однако мой вывод выглядит следующим образом.

enter image description here

Я повернул изображение, чтобы попытаться увидеть глубину, но это плоский объект.

Я попытался определить, откуда может возникнуть проблема, пытаясь нарисовать каждый треугольник по отдельности, изменив метод рендеринга на gl.drawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);, чтобы он рисовал только один треугольник.Я попытался нарисовать все четыре лица по отдельности, и все они нарисованы на экране.

1 Ответ

0 голосов
/ 27 сентября 2018

Я нашел проблему.Первоначально я масштабировал треугольник так, чтобы

model.scale(new Vector3f(0.2f, 0.2f, 0.0f));

В результате ось z умножалась на 0. Глупая ошибка, надеюсь, это поможет кому-то в будущем.

...