Search code examples
javaopenglgraphics3dlwjgl

Depth not being render but instead is displaying overlay


I have an issue in my project where I am trying to draw a pyramid on screen but the depth is not being displayed.

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);
    }

I create my mesh object with following code where Vertices and Indices are defined as :

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);
}

In order to display them to screen I call my render function from my game loop which is defined as.

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);
}

To create my FloatBuffer and IntBuffer I have a factory class defined as.

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;
    }

}

So the issue i'm getting is that it should have drawn four triangles to screen to form a pyramid, however my output looks like this.

enter image description here

I have rotated the image to try and see the depth but it is a flat object.

I have tried to identify where the issue may be coming from by attempting to draw each triangle individually by changing my render method to gl.drawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0); So that it only draws one triangle. I have tried to draw all four faces individually and all are drawn to screen.


Solution

  • I found the issue. I was originally scaling the triangle such that

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

    As a result the z axis was being multiplied by 0. Silly mistake, hope this helps someone in the future.