mkaatr
mkaatr

Reputation: 59

Rendering surfaces in OpenGL with depth test correctly

I am wondering how to render surfaces using depth test correctly. In my case it is not working although it has been enabled. I tried many combinations but can not figure out what is being done wrong, it might been some ordering of OpenGL commands, or it might be something I am missing completely.

I have this code that uses opengl to render a 2d game I am working on. I want to enable z buffering and depth test to simplify things in the code. I read a number of tutorials online and made changes as instructed but can not figure out why it is not working.

the code of the main function is shown below, I am changing the values of z for the two squares to be -10 and -25 and swapping them later on, but I always get the first square rendered over the second one no matter what values I use:

void MainGame::RenderTestUI()
{
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glDepthFunc(GL_LESS);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    GLSLProgram *ActiveShader = nullptr;
    ActiveShader = &ColorShader;
    ActiveShader->Use();


    GLint Location1 = ActiveShader->GetUniformLocation("cam");
    glm::mat4 tmp = Camera.GetCameraMatrix();
    glUniformMatrix4fv(Location1, 1, GL_FALSE, &tmp[0][0]);

    glActiveTexture(GL_TEXTURE0);

    GLint Location2 = ActiveShader->GetUniformLocation("basic");
    glUniform1f(Location2, 0);

    glBindTexture(GL_TEXTURE_2D, GameTextures.ID);
    CurrentBoundTexture = GameTextures.ID;

    RenderingBatch.StartAddingVerticies();

    this->GameMap.TileList[1].FillSixVerticies(RenderingBatch.VertexListPtr, 0, 0);
    RenderingBatch.VertexCount += 6;

    for (int i = 0; i < 6; i++)
        RenderingBatch.VertexListPtr[i].z = -10; // first face 


    this->GameMap.TileList[2].FillSixVerticies(&RenderingBatch.VertexListPtr[RenderingBatch.VertexCount], 8, 8);
    RenderingBatch.VertexCount += 6;

    for (int i = 0; i < 6; i++)
        RenderingBatch.VertexListPtr[i+6].z = -25; // second face




    RenderingBatch.EndAddingVerticies();
    RenderingBatch.CreateVBO();
    RenderingBatch.Render();

    ActiveShader->Unuse();

    // swap buffers
    SDL_GL_SwapWindow(GameWindow);

}

The end result is always the same regardless of the value of z i am assigning to the two faces, the result could be seen here:

enter image description here

any advice is highly appreciated.

Upvotes: 1

Views: 332

Answers (1)

robthebloke
robthebloke

Reputation: 9672

When setting up the SDL surface to draw on, did you ask for a depth buffer prior to calling SDL_CreateWindow?

SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

Upvotes: 1

Related Questions